push_back是在vector有效元素的末尾添加新元素,所以首先要明白resize与reserve的区别
先上结论:
vec.resize(size)后用push_back,是在vec[size]处开始添加元素,所以resize与push_back不要连用。
resize后,直接通过下标索引的方式改变元素值。
对于大量数据的存储,使用reserve + push_back 的方式,或者resize + 下标索引 的方式。
1、resize与reserve及vector构造函数的区别
1)resize(int size,int default=0)改变vector的有效空间大小,并对vector空间中每一个单位空间调用构造函数初始化,赋初始值(默认为0),可以直接通过下标索引访问更改vector中的元素
2)reserve(int size)改变vector的总空间(capcity),不对vector空间中每一个单位空间调用构造函数初始化。
3)vector vec(size);当给定size值时,相当于resize,对vec中size个元素初始化,赋初始值。
2、push_back的使用
1)直接声明vector,并调用push_back
vector<int> vec;
for(int i=0;i<3;i++)
vec.push_back(i);
for(int i=0;i<vec.size();i++)
cout<<vec[i];
结果为0,1,2
对于少量数据的存储可以直接用这种方式
2)reserve预分配存储区大小后,用push_back,结果等同于1)
3)resize改变有效空间后,用push_back
vector<int> vec;
vec.resize(3); //改变vec有效空间,此时vec中的有效元素有三个0,0,0
for(int i=0;i<3;i++)
vec.push_back(i);
for(int i=0;i<vec.size();i++)
cout<<vec[i];
结果为0,0,0, 0,1,2
push_back是在vec有效元素后添加新元素,最后的总空间为(resize的空间+push_back添加的空间)
4)声明vector时给定空间大小size,结果等同于3)resize
vector<int> vec(3); //此时vec中的有效元素有三个0,0,0
for(int i=0;i<3;i++)
vec.push_back(i);
for(int i=0;i<vec.size();i++)
cout<<vec[i];
结果为0,0,0, 0,1,2