vector
容器,底层为一个数组。与array十分相似。但是array是静态空间,而vector是一个动态的空间。这就是为什么vector的方法中有容量(capacity)和大小(size)的两个方法。本文将会对这两个方法进行区分。
初始化
vector<int> a = { 1,2,3,4,5,6 };//定义一个类型为int类型的容器a,并且初始化为1~6
vector<int> b(10);//定义一个容器大小为10的b容器,初始值不确定
vector<int> c(2, 3);//定义一个int类型的容器c,初始化为2个3
vector<int> d(c);//用c对b进行拷贝构造
vector<int> e(c.begin(), c.end());//用c对e进行赋值
获取元素
地址连续,支持下标形式获取元素
vector<int> a = { 1,2,3,4,5,6 };
cout << "发挥a的第一个元素: " << a.front() << endl;
cout << "返回a的最后一个元素: " << a.back() << endl;
int i = 3;
if (i < a.size())
{
cout << "返回a的第i个元素: " << a[i] << endl;
}
增删操作
vector<int> a = { 1,2,3,4,5,6 };
a.clear();//清空整个容器
a.erase(a.begin(), a.end() - 1);//删除从第一个到倒数第二个的元素
a.pop_back();//删除容器中最后一个元素
a.push_back(2);//在容器最后位置插入元素2
a.insert(a.begin(), 3);//在a的头部插入元素3
a.insert(a.begin(),4, 3);//在a的头部插入四个3
常用算法
vector<int> a = { 1,2,3,4,5,6,5 };
reverse(a.begin(), a.end());//翻转数组
sort(a.begin(), a.end());//将a从小到大进行排列
//查询5第一次出现的位置,返回类型为vector<int>::iterator迭代器,c++11中新标准允许使用auto接取返回值
auto i = find(a.begin(), a.end(), 9);
cout << *i << endl;//接取的i为地址,需要取地址上的值
遍历方法
vector<int> a = { 1,2,3,4,5,6,5 };
//1
for (vector<int>::iterator iter = a.begin();iter != a.end();iter++)
{
cout << *iter;
}
cout << endl;
//2
for (size_t i = 0;i < a.size();i++)
{
cout << a[i];
}
cout << endl;
//3
for (int& i : a)//c++11 for循环新语法
{
cout << i;
}
cout << endl;
size和capacity
vector<int> a(4, 8);
cout << "size = " << a.size() << endl;
cout << "capacity = " << a.capacity() << endl;
a.push_back(1);
cout << "size = " << a.size() << endl;
cout << "capacity = " << a.capacity() << endl;
a.push_back(1);
cout << "size = " << a.size() << endl;
cout << "capacity = " << a.capacity() << endl;
a.push_back(1);
cout << "size = " << a.size() << endl;
cout << "capacity = " << a.capacity() << endl;
a.push_back(1);
cout << "size = " << a.size() << endl;
cout << "capacity = " << a.capacity() << endl;
a.push_back(1);
cout << "size = " << a.size() << endl;
cout << "capacity = " << a.capacity() << endl;
a.push_back(1);
cout << "size = " << a.size() << endl;
cout << "capacity = " << a.capacity() << endl;
a.push_back(1);
cout << "size = " << a.size() << endl;
cout << "capacity = " << a.capacity() << endl;
a.push_back(1);
cout << "size = " << a.size() << endl;
cout << "capacity = " << a.capacity() << endl;
在这个容器中我们将容器的size初始化大小为4,那么很明显容量也为4。当进行插入一个元素时,size增加了1,容量增加了原容器4的一半2。当大小和容量在此相等时,继续插入容量又是增加了原容器6的一半3。所以我们可以从这里得出结论:当原容器的容量不足以新插入元素,vector会重新寻找一块内存地址,大小为原容器容量的1.5倍(VS2019环境下,每个编译器中可能开辟的新内存空间大小不同)。再销毁原来的内存空间。再数据量较大的情况下,vector的使用效率较低,并可能引发迭代器的失效。