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

  • 相关阅读:
    RE
    【LeetCode】198. House Robber
    【LeetCode】053. Maximum Subarray
    【LeetCode】152. Maximum Product Subarray
    【LeetCode】238.Product of Array Except Self
    【LeetCode】042 Trapping Rain Water
    【LeetCode】011 Container With Most Water
    【LeetCode】004. Median of Two Sorted Arrays
    【LeetCode】454 4Sum II
    【LeetCode】259 3Sum Smaller
  • 原文地址:https://www.cnblogs.com/CreatorKou/p/8883522.html
Copyright © 2011-2022 走看看