zoukankan      html  css  js  c++  java
  • vector.resize 与 vector.reserve的区别

    std::vector的reserve和resize的区别
    1. reserve: 分配空间,更改capacity但不改变size
    2. resize: 分配空间,更改capacity也改变size

    如果知道vector的大小,resize一下可以当数组来用,不会分配多余的内存。

    reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。

    resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。

    再者,两个函数的形式是有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。下面是这两个函数使用例子:

      1. vector<int> myVec;

      2. myVec.reserve( 100 );     // 新元素还没有构造,

      3.                           // 此时不能用[]访问元素

      4. for (int i = 0; i < 100; i++ )

      5. ...{

      6.      myVec.push_back( i ); //新元素这时才构造

      7. }

      8. myVec.resize( 102 );      // 用元素的默认构造函数构造了两个新的元素

      9. myVec[100] = 1;           //直接操作新元素

      10. myVec[101] = 2;

    我们都知道, vector是在内存中是连续分布的,所以设计上总会在所有已经有元素外预留一些空间,否则每次追加新元素时都要再次分配内存,那准备就绪将很低.

    假如当vector中可能会存在约500个元素时, 比较两种做法:

    1. vector<int> myVec, 然后500次调用 myVec.push_back(****)

    2. vector<int> myVec(500), 然后500次调用 myVec.push_back(****)

    做法2只需要进行1到2次内存分配,而做法1不知道要进行多少次内存分配了.

    现在, 同样,两个问题:

    Q1. 当前容器预留了多大空间(在不进行重新分配内存的前提下,最多可以容纳多少个元素)?

    Q2. 怎样重设当前容器的预留大小?

    A1: capacity().

    A2: reserve(). 

    辨析:

    所以说resize()和reserve根本是两回事,resize影响元素的个数. reserve只分配预留的空间.

    所以 capacity() >= size() 恒成立.

    另外有几个问题:

    1. vector<int> a(10);  a.reserve(20); a[10] = 999; // 错误, 因为a还没有下标为10这个元素,现在size() ==10, capacity() ==20; 要追加下标10这个元素只能push_back;

    2. 假设vector<int> sample;

    当前size()为50, capacity()为100,经过以下操作:

    (1) resize(10).  //size() == 10; 10到49下标的元素被删除. capacity()==100,不变,没有进行内存重新分配.

    (2) resize(60).  //size() == 60; 50到59下标用默认构造函数填充. capacity() == 100,不变,没有进行内存重新分配.

    (3) resize(60, 9999).  //size() == 60; 50到59下标用9999填充. capacity() == 100,不变,没有进行内存重新分配.

    (4) resize(200). //size() == 200; 50到199下载用默认构造函数填充. capacity() == 200, 自动扩容,重新分配内存.

    (5) reserve(10). //size() == 50; 不变,没有元素被删除, capacity() == 100, 不变. 即reserve调用没起作用.

    (6) reserve(60). //size() == 50; 元素没有变, capacity() == 100, 不变. 即reserve调用没起作用.

    (7) reserve(200). //size() == 50; 元素没有变, capacity() == 200, 扩容,重新分配内存.

    3. vector<int> sample(10);  //size() == 10; reserve() == 10;

    sample.push_back(999); //size() == 11; reserve () == 15; //自动扩容, reseve为什么不是11呢? 这个超余量是不一定的,也不一定是15.

  • 相关阅读:
    合并链表
    ImportError: cannot import name 'GMM' from 'sklearn.mixture'
    SyntaxError: invalid character in identifier
    在 jupyter notebook 中插入图片
    Atom 换行后删除前面空格,需要按2/4次退格键
    win10输入法InpuMode默认显示中文
    Visual Studio(WindowsSDK.targets(46,5): error MSB8036: 找不到 Windows SDK 版本8.1)
    atom修改注释的字体,字号,颜色
    '__int64' has not been declared
    VMware 打开虚拟机库
  • 原文地址:https://www.cnblogs.com/kex1n/p/2512789.html
Copyright © 2011-2022 走看看