vector之reserve的坑
1 #include <iostream> 2 #include<typeinfo> 3 #include<vector> 4 5 using namespace std; 6 7 int main() 8 { 9 /* 10 *1.reserve(10), but size=0, 11 *结果:分配了至少10个int存储空间 12 *潜在隐患:可以使用[]访问ivec 13 *即使用[]为ivec1初始化,size仍旧为0 14 *注意:对vector调用reserve()之后,一定要用push_back()初始化 15 *如果被误导,使用[]初始化,那么极易发生下面的逻辑错误(因为编译器没有指导出潜在隐患): 16 *vector<int> ivec1; 17 *ivec1.reserve(10); 18 *for(int i=0;i<10;++i){ivec[i]=somedata} //no error(should have error) 19 *for(int i=0;i<ivec1.size();++i){some operations} //size=0,no effect 20 */ 21 vector<int> ivec1; 22 ivec1.reserve(10); 23 cout << ivec1.size() << endl; //0 24 for(auto &a : ivec1){ //do 0 times : no output 25 cout << a << " "; 26 } 27 cout << endl; 28 for(int i=0;i<10;++i){//do 10 times 29 cout << ivec1[i] << " "; 30 } 31 for(int i=0;i<10;++i){//do 10 times 32 ivec1[i] = i; 33 } 34 cout << ivec1.size() << endl;//still be 0!!! 35 for(int i=0;i<ivec1.size();++i){//logical problems:no effect 36 cout << ivec1[i] << " "; 37 } 38 cout << endl; 39 /*如果使用push_back()初始化 40 */ 41 cout << "after push_back : "; 42 for(int i=0;i<10;++i){ 43 ivec1.push_back(i); 44 } 45 cout << ivec1.size() << endl; 46 47 /* 48 *resize(10), size=10,can use [] accese 49 *resize(10)的结果就是强制使ivec2的size=10,并且将这10个元素初始化 50 *推荐使用resize() 51 */ 52 vector<int> ivec2; 53 ivec2.resize(10); 54 cout << ivec2.size() << endl; //10 55 for(auto &a : ivec2){ //10 output 56 cout << a << " "; 57 } 58 cout << endl; 59 for(int i=0;i<10;++i){ //10 assignment = 60 ivec2[i] = i; 61 } 62 for(int i=0;i<ivec2.size();++i){ 63 cout << ivec2[i] << " "; 64 } 65 cout << endl; 66 for(auto &a : ivec2){ //10 output 67 cout << a << " "; 68 } 69 return 0; 70 }
reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。
resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。
再者,两个函数的形式是有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。下面是这两个函数使用例子:
posted on 2018-04-19 15:48 CreatorKou 阅读(305) 评论(0) 编辑 收藏 举报