vector 和 string 容器在动态插入一个新的对象时,如果容器内空间不够,该容器会:

  1. 重新分配空间
    通常的做法是分配当前 Capacity 大小两倍的空间。
  2. 将旧空间中的所有元素拷贝进新的空间中。
  3. 销毁原有空间中存储的对象。
  4. 销毁原有的空间。

可见一个简单的操作背后实际可能会有许多动作。

例如如果想创建一个容器让其存放 1 ~ 1000 这 1000 个 int 值,如果用下面的方法:

vector<int> v;
for (int i = 1; i < 1001; ++i)
{
v.push_back(i)
}

典型情况下该过程将会导致约 2 ~ 10 次内存的重新分配 (前面提过,容器内存分配时,典型的方式是空间加倍,则内存从 \(1*sizeof(int)\) 增长倒 \(1000*sizeof(int)\) 约需要 10 次 (\(2^{10} = 1024\))。)

我们可以在容器创建之后通过 Reserve 来显式地让容器预先分配好足够的空间来减少频繁的 reallocation,形如:

vector<int> v;
v.reserve(1000);
for (int i = 1; i < 1001; ++i)
{
v.push_back(i)
}

另外,简单总结一下 vector 和 string 提供的 size 相关函数:

  • size()
    告之容器内 存放了 多少元素。它并不告之容量。
  • capacity()
    告之该容器 可以 存放多少元素。我们可以通过 \(capacity() - size()\) 来计算剩余的空间。
  • resize(size_t n)
    该函数强制让容器将保存的元素数量从当前数量变成 n 。

    • 如果 n 比当前的容纳的元素数量小,则 Capacity 不变,但 n 以后的元素被销毁。
    • 如果 n 更大,则先重新分配内存 (改变了 Capacity),然后调用元素的 Default
      Constructer 来初始化需要填充的内存。
  • reserve(size_t n)
    该函数让容器至少可以容纳 n 个元素:

    • n > 当前 capacity: 重新分配空间,改变 Capacity,但不影响 size。
    • n < 当前 capacity: nothing is changed.

Effective STL 学习笔记14: Use reserve to avoid unnecessary reallocations.的更多相关文章

  1. Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...

  2. Effective STL 学习笔记 32 ~ 33

    Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  3. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

  4. Effective STL 学习笔记 39 ~ 41

    Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  5. Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value

    Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...

  6. Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

    Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...

  7. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  8. Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor

    Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor */--> div ...

  9. Effective STL 学习笔记 Item 21:Comparison Function 相关

    Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...

随机推荐

  1. C++模版详解(-)

    C++模版:       模版时C++支持多参数多态的工具,使用模版可以为用户为类或函数声明一般模式,使得类的数据成员,或者成员函数的参数,返回值取得任意类型. 模版是一种对类型进行参数化的工具: 通 ...

  2. Chapter6(函数) --C++Prime笔记

    1.重载函数,也就是说一个名字可以对应几个不同的函数. 2.内置类型的未初始化局部变量将产生未定义的值. 3.局部静态对象在程序执行路径第一次进过对象定义语句时初始化,并且直到程序终止才被销毁. 内置 ...

  3. 科学计算三维可视化---Mayavi可视化实例

    一:Dragon绘制实例(三维扫描的绘制) 三维扫描主要用于对物体空间外形结构以及色彩进行扫描,用以获得物体表面的空间坐标, 他的主要意义在于能够将实物的立体信息转换为计算机能够直接处理的数据信号,为 ...

  4. bzoj千题计划145:bzoj3262: 陌上花开

    http://www.lydsy.com/JudgeOnline/problem.php?id=3262 三维偏序 第一维排序,第二维CDQ分治,第三维树状数组 #include<cstdio& ...

  5. Elasticsearch之Java实战

    资料 http://www.cnblogs.com/kamong/p/6099914.html 搭建Elasticsearch服务器

  6. python 12306 车次数据获取

    ssl._create_default_https_context = ssl._create_default_https_context train_data = '2018-10-20' head ...

  7. 生死相依:说说JQuery中die()、live()详解[翻译]

    一个web前端工程师,应该知道jquery的.live()函数,知道它是做什么用的,但是不知它是怎么样工作的,使用起来也是不得得心应手的,甚至也没听说过.die()(去掉bind事件).即使你能熟悉这 ...

  8. PartyPlay发布版

    发布版本在beta版本的基础之上修改了pose王中的显示函数部分,使其可以正常的多次显示不同图片,不会出现卡在一张图片的问题上. 因此总的发布版本内容: 1.谁是卧底: 点击进入谁是卧底,进入游戏前的 ...

  9. HDU 2722 Here We Go(relians) Again (最短路)

    题目链接 Problem Description The Gorelians are a warlike race that travel the universe conquering new wo ...

  10. 钉钉头像大小设置 阿里cdn尺寸截取参数设置

    默认api的接口返回的avatar字段,是原始图片大小字段,尺寸和空间都是原始大小,如果想节省流量或统一尺寸,可以用阿里cdn自带的尺寸截取功能, 比如钉钉头像 avatar字段 返回值为原始大小ht ...