vector介绍
vector是STL中序列容器的其中一种,也是实际运用时最常用到的容器之一,与C++内建的array非常相似。两者的唯一差别就是对于内存空间的分配上。array是静态空间分配方式,而vector是动态空间分配方式(动态分配在第三点会详细讲),运用比较灵活。vector维护的是一个连续线性空间.(详细请查看C++ vector)。那在实际编程中怎么运用vector呢。
vector运用
下面用标记号**标识的是重要注意的
#include <iostream>
#include <vector>
vector<int> vecNum{1,6}; //声明并初始化
vecNum.push_back(4); //从后面插入 {1,6,4}
vecNmu.insert(vecNum.begin(), 5); //从前面插入 {5,1,6,4}
auto size = vecNum.size(); // size=4
auto num = vecNum.at(2); //num = 6
//**resize**指的是强制容器空间为指定的大小,如果没有填充元素,默认为0
vecNum.resize(50);
size = vecNum.size(); // size=50
//**reserve**指的是分配不小于指定大小的空间,对元素个数不影响
vecNum.reserve(120);
size = vecNum.size();// size=50
auto capLen = vecNum.capacity(); //capLen = 120
//**clear**只会清除值,并没有清除内存,释放空间。
vector<int> tmpVec{1,5};
cout << tmpVect.empty() << endl; //输出false
cout << a.size() << endl; //输出2
cout << a.capacity() << endl; //输出2
tmpVect.clear();
cout << tmpVect.empty() << endl; //输出true
cout << a.size() << endl; //输出0
cout << a.capacity() << endl; //输出2 ****(注意)****
//**erase**这个方式使用容易疏忽出错
auto it = vecNum.begin();
for(; it != vecNum.end(); ) {
if(*it == 6) {
it = vecNum.erase(it);//****(注意)****
}
it++;
}
//**emplace_back**通过右值引用构造对象,不需要拷贝或者移动内存,相比push_back能更好地避免内存的拷贝与移动,使容器插入元素的性能得到进一步提升。
class A {
int x;
double y;
A(int a, double b):x(a),y(b){}
};
vector<A> v;
v.emplace_back(1, 2);
cout<<v.size()<<endl;
vector分配空间的机制
“所谓动态增加大小,并不是在原空间之后接续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。这是程序员易犯的一个错误,务需小心。”–摘自《STL源码解剖》