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. SQL联合查询中的关键语法

    http://www.cnblogs.com/aaapeng/archive/2010/01/20/1652151.html 联合查询效率较高.以下例子来说明联合查询的好处 t1表结构(用户名,密码) ...

  2. static的应用

    静态变量.静态代码块.静态方法.非静态方法的区别: 执行顺序:静态变量和静态代码块是按照先后顺序执行的,即在类加载的时候就执行的,属于自动执行的.使用场景:就是一些全局常量,在开始的时候就需要加载的. ...

  3. python---await/async关键字

    推文:玩转 Python 3.5 的 await/async 首先看正常的两个函数之间的执行 def func1(): print("func1 start") print(&qu ...

  4. Ubuntu 搭建svn服务器 ,以及常见错误解决方案

    一.安装命令: 1)以root身份登录.执行:sudo su -命令 2)执行安装命令:apt-get install subversion   二.创建项目目录 1)mkdir  /home/svn ...

  5. MAC下 Apache服务器配置

    今天做了一个注册登录提交的页面,后续操作需要用到后端的知识 php+Mysql,之前只是有些了解,现在开始具体操作了,首先从配置环境开始.查了好几篇文档与博客,了解了挺多知识. Mac下Apache服 ...

  6. bzoj千题计划112:bzoj1022: [SHOI2008]小约翰的游戏John

    http://www.lydsy.com/JudgeOnline/problem.php?id=1022 http://www.cnblogs.com/TheRoadToTheGold/p/67448 ...

  7. HDU 2188 基础bash博弈

    基础的bash博弈,两人捐钱,每次不超过m,谁先捐到n谁胜. 对于一个初始值n,如果其不为(m+1)的倍数,那么先手把余数拿掉,后继游戏中不管如何,后手操作后必定会有数余下,那么先手必胜,反之后手必胜 ...

  8. CS20 D LCA

    给出一棵树,许多询问,每次询问A,B,C三点,求一点使到三点距离最小,输出该点和最小值. 很明显就是求LCA,三种组合都求一次LCA,然后在里面选个距离和最小的就行了. 官方题解里面的代码求LCA是在 ...

  9. java与Excel (.xls文件) ---使用JXL创建,增添表格文件

    由于一些原因要搞一下excel文件,个人感觉poi太难,所以用了JXL(感觉比较简单). 1.添加外部归档 jxl.jar 2. /** 生成的xls文件第一次需要手动选择EXCEL打开* * */ ...

  10. 【BearChild】

    \(≧▽≦)/ BearChild is salty. If you want to save him,please call QQ:423339833 to talk♂with him. Have ...