什么是vector
vector类我们可以将其看作是一个能够动态扩容的数组。 在vs下其扩容一般每次是按照前一次容量的1.5倍进行扩容。如:4,6 9…string类支持的功能,在vector下基本都能使用。
无参构造函数
格式:vector<存储数据类型> 容器名字
vector<int> v1;
??
(
1
)
(1)
(1)存储int 类型数据,容器名字为v1 的vector 。
有参构造函数
??
(
1
)
(1)
(1)普通版本 格式:vector<存储的数据类型>容器名字(n,a) vector 的前n 个位置会被初始化成a
vector<int> v1(10,5);
??
(
2
)
(2)
(2)迭代器版本 格式:vector<存储的数据类型>容器名字(迭代器1,迭代器2) vector会依次 被初始化成迭代器1到迭代器2这个区间存储的数据。
vector<int> v3(4, 5);
vector<int> v2(v3.begin(), v3.end());
??
(
1
)
(1)
(1)使用v3 的迭代器初始化v2
拷贝构造函数
vector 支持使用一个容器去拷贝另一个容器。
vector<int> v1(4, 5);
vector<int> v2(v1);
??
(
1
)
(1)
(1)使用v1 容器去拷贝v2 。
迭代器
vector 同样支持迭代器进行遍历访问。迭代器在stl 中的用法基本一致。 ??
(
1
)
(1)
(1)正向迭代器 :begin 迭代器:指向vector 存储的第一个 元素。 :end 迭代器:指向vector 最后一个元素的下一个 位置。
vector<int> v3;
v3.push_back(1);
v3.push_back(2);
v3.push_back(3);
vector<int>::iterator it = v3.begin();
while (it!=v3.end())
{
cout << *it << endl;
it++;
}
??
(
2
)
(2)
(2)反向迭代器 :rbegin 迭代器:指向vector 存储的最后一个 元素。 :end 迭代器:指向vector 第一个元素的上一个 位置。
vector<int> v3;
v3.push_back(1);
v3.push_back(2);
v3.push_back(3);
vector<int> ::reverse_iterator it= v3.rbegin();
while (it != v3.rend())
{
cout << *it << endl;
it++;
}
??
(
1
)
(1)
(1)反向迭代器的名词是revese_iterator 。起始迭代器为rbegin() ,末尾迭代器为rend() 。
push_back
和string 一样,vector 的push_back 也是尾插一个数据。 格式:容器名字.push_back(插入的数据)
vector<int> v1;
v1.push_back(4);
pop_back
将容器最后一个位置的数据弹出(类似栈的出栈一样) 格式:容器名字.pop_back()
vector<int> v1;
v1.push_back(10);
v1.pop_back();
常用函数接口
[]
vector 支持随机访问容器内的某个位置,用法也很简单。 格式:容器名字[访问的位置]
vector<int> v1(10,5);
cout<<v1[2]<<endl;
ps:vector 存储数据也是从0 开始 ??
(
1
)
(1)
(1)访问v1 的第三个数据。
reserve
作用:扩容 注意:这里的n 是可以存储数据的个数,而不是字节数。并且reserve 不会对扩容以后的空间进行初始化。
vector<int> v1;
v1.reserve(100);
??
(
1
)
(1)
(1)在经过扩容以后,v1 容器的容量会变成100。
resize
作用:扩容 resize 和用法和reserve 基本一致。 只不过resize 对于扩容的数据会进行初始化。也就是参数二 。 举例说明:v1 容器当前存储了5个1 ,这时扩容到20 ,剩下的15 个空间就会被初始化成参数二 的值。
vector<int> v1;
v1.resize(100,5);
ps::resize 和reserve 扩充的容量小于当前容量的时候都不会使得容量变小。
vector的底层原理
vector类中包含了三个T类型的指针,分别是 -start :指向空间的起始部分 _finish :指向当前已用空间的末尾 _endofstorger :指向申请空间的末尾
insert
参数一:插入的位置(迭代器的位置) 参数二:要插入的数据
vector<int> v3;
v3.insert(v3.begin(), 100);
erase
??
(
1
)
(1)
(1)删除单个数据 参数:删除迭代器位置的数据
vector<int> v1(10,6);
v1.erase(v1.begin());
??
(
2
)
(2)
(2)删除某个区间的数据 参数一:开始删除的位置。 参数二:删除结束的下一个位置。
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.erase(v1.begin(), --v1.end());
vector常搭配使用的algorithm
??
(
1
)
(1)
(1)find查找 参数一:开始查找的位置 参数二:查找结束位置的下一个位置 参数三:要查找的值 ps::如果没找到,会返回末尾迭代器。
vector<int> v1;
vector<int>::iterator it=find(v1.begin(),v1.end(),10);
if(it!=v1.end())
cout<<*it<<endl;
??
(
2
)
(2)
(2)sort排序 sort 的底层是通过快排qsort 进行实现的,时间复杂度为nlongn ; 参数一:排序开始的位置 参数二:排序结束位置的下一个位置
vector<int> v1;
v1.push_back(10);
v1.push_back(5);
v1.push_back(4);
sort(v1.begin(),v1.end());
??
(
3
)
(3)
(3)reverse逆序 reverse 用于将某个迭代器区间的元素进行逆序。 参数一:开始的位置 参数二:结束位置的下一个位置
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
reverse(v1.begin(), v1.end());
二维vector和二维数组的区别
在C语言中,如果想要申请一块二维数组的空间,需要使用malloc 函数,这时候就需要申请一个指针数组,并且还需要为指针数组里的每一个元素申请一段空间。 假设需要申请一块4行4列的空间。
int **p=(int**p)malloc(sizeof(int*)*4)
从代码上就能看出非常的麻烦。 使用vector 创建二维数组就非常爽了,假设需要创建一个四行四列的数组。
vector<vector<int>>res;
res.resize(4);
for(int i=0;i<4;i++)
res[i].resize(4);
并且在访问的时候二维数组和二维vector 的访问方式也是不同。 二维数组p ,在访问元素时可以通过[] 进行访问,如p[i][j] ,其在访问i 行j 列的数据的时候是通过解引用两次的方式。 而二维vector 通过[] 进行访问的时候,如res[i][j] ,是通过[] 返回一个对象,再通过这个对象继续访问。
|