最近做东西要用到vector,之前没怎么用过,对其中的一些方法产生了一些误解,现在总结一下,希望对别人能有帮助。
reserve()是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此需要用push_back()/insert()函数插入新元素才能引用。
resize()是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了。若容器中已有元素,使用resize()时需要调用clear()。
resize(),clear(),erase()等都只改变容器的size,并不释放内存。
例1:
vector<int> vec1,vec2;
vec1.resize(10); //申请了空间,也创建了对象(默认构造函数)
vec2.reserve(10); //申请了空间,但没有创建对象
for(int i=0;i<10;i++)
{
vec1[i]=i; //没错
vec2[i]=i; //出错
}
例2:
vector<int> vec1,vec2;
vec1.resize(10);
vec1.push_back(1); //vec1[0]~vec1[9]为一个很大的负数,vec1[10]=1
vec2.reserve(10);
vec2.push_back(1) //vec2[0]=1;
例3:
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.resize(2,10); //vec.size()=2,但vec[0]~vec[2]中仍存放1~3,并没有变成10
vec.clear();
vec.resize(2,10); //vec.size()=2,vec[0]~vec[1]中存放10