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函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。下面是这两个函数使用例子:

原文地址:https://www.cnblogs.com/CreatorKou/p/8883522.html