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

  • 相关阅读:
    使用JS实现网页动态换肤
    数据库更新Sql脚本总结
    Javascript无刷新获取当前时间
    ASP.NET将网页设为桌面图标实现
    解决在IE浏览器中resize事件执行多次
    linux编译安装gcc5.3.0
    JAVA抽象类和接口
    JAVA内部类
    推测竞赛中测试集的正负比例
    Codeforces Round #742 (Div. 2) 题解
  • 原文地址:https://www.cnblogs.com/CreatorKou/p/8883522.html
Copyright © 2011-2022 走看看