点击查看Evernote原文

#@author:       gr
#@date: 2014-09-15
#@email: forgerui@gmail.com

Chapter2 vector和string

Topic 15: 注意string实现的多样性

  string可能有多种不同的实现。文中介绍了四种,由于采用不同的实现,使用sizeof(string)计算会得到不同的值。

  在这四种实现中,string对象的大小可以是一个char*指针大小的1到7倍。并且,各种实现的动态内存分配也不尽相同,可能需要1到2次的动态内存分配。

例子 :

  其中一种实现提供了对小字符串的性能优化。首先,这个string占据了7倍char*的空间,是实现中空间最大的,其中有4倍空间是用来存储字符,最多15个字符,这样当字符小于16个时,不需要动态分配内存;如果,超过15个字符,则会动态分配内存,并将地址存储在x4空间的顶端。

Topic 17: 使用swap技巧除去多余的容量

  vector使用reserve预先申请空间时,可能申请的很大,如何去除多余的空间呢。使用swap技巧可以有效解决这个问题。用已有vector去初始化一个临时向量,并进行交换,最后交换后临时向量被析构(先前的已有向量)。注意,这里的除去多余容量不是全部空余向量,因为编译器可能保持一些空间以保证空间为2的乘幂数。

  

  同样,也可以使用swap技巧去清空vectorstring

vector<int> vi;
vi.reserve(100000);
//....插入元素操作
//使用swap交换
vector<int>(vi).swap(vi);
//清空
vector<int>().swap(vi);
string str("afdsaf");
string().swap(str);

Topic 18: 避免使用vector<bool>

  使用vector<bool>可能和你期望得到的结果不同,它不能称得上真正的容器。一般取得一个容器元素的地址会返回一个指向容器中元素类型的指针,而vector<bool>却是返回一个代理对象。

  原因在于,vector<bool>采用紧凑型存储,即一个bool只占用一位(bit)。一个8位的字节(byte)可以存放8个bool,那么返回的指针会指向单个位,而指向单个位(bit)是被禁止的,为了避免这个问题,会用一个代理对象包装,所以会莫名其妙地产生一个新的对象。

解决方法

  • 使用deque<bool>deque确实存储bool
  • 使用bitsetbitset使用紧凑表示,无法动态增删。

###《Effective STL》--Chapter2的更多相关文章

  1. 《Effective STL》学习笔记

    http://www.cnblogs.com/arthurliu/archive/2011/08/07/2108386.html 作者:咆哮的马甲 出处:http://www.cnblogs.com/ ...

  2. ###《Effective STL》--Chapter3

    点击查看Evernote原文. #@author: gr #@date: 2014-09-13 #@email: forgerui@gmail.com Chapter3 关联容器 Topic 22: ...

  3. ###《Effective STL》--Chapter5

    点击查看Evernote原文. #@author: gr #@date: 2014-09-17 #@email: forgerui@gmail.com Chapter5 算法 Topic 30: 确保 ...

  4. ###《Effective STL》--Chapter6

    点击查看Evernote原文. #@author: gr #@date: 2014-09-27 #@email: forgerui@gmail.com Chapter6 函数子.函数子类.函数及其他 ...

  5. ###《Effective STL》--Chapter7

    点击查看Evernote原文. #@author: gr #@date: 2014-08-31 #@email: forgerui@gmail.com Chapter7 在程序中使用STL Topic ...

  6. ###《Effective STL》--Chapter1

    点击查看Evernote原文. #@author: gr #@date: 2014-09-12 #@email: forgerui@gmail.com Chapter1 容器 Topic 4: 调用e ...

  7. ###《Effective STL》--Chapter4

    点击查看Evernote原文. #@author: gr #@date: 2014-09-14 #@email: forgerui@gmail.com Chapter4 迭代器 Topic 26: i ...

  8. 容器使用的12条军规——《Effective+STL中文版》试读

    容器使用的12条军规——<Effective+STL中文版>试读     还 记的自己早年在学校学习c++的时候,老师根本就没有讲STL,导致了自己后来跟人说 起会C++的时候总是被鄙视, ...

  9. 《Effective STL中文版》前言

    <Effective STL中文版>前言     我第一次写关于STL(Standard Template Library,标准模板库)的介绍是在1995 年,当时我在More Effec ...

随机推荐

  1. 转载 .net中的dll.refresh文件和pdb文件

    转载原地址: http://blog.csdn.net/lihuang319/article/details/6433727 dll.refresh文件 打开refresh文件,可以看到里面仅仅是个路 ...

  2. Stones

    题目是:HDU1896 题目简述:输入一堆石头,每个石头有自己所在的位置p,以及自己可以抛多远的距离d.你每遇到第奇数个石头,就把石头丢出去,第偶数个石头就不管.计算出最后一个石头它所处的位置. 解法 ...

  3. .NET设计模式(3):抽象工厂模式(Abstract Factory)

    ):抽象工厂模式(Abstract Factory) 抽象工厂模式(Abstract Factory) --探索设计模式系列之三 Terrylee,2005年12月12日 转载:http://terr ...

  4. win10中android studio中的terminal不能输入

    1 打开CMD窗口右击           2    3 重启电脑,你试试就知道了.  

  5. CentOS6.5安装nginx及负载均衡配置

    所有的安装包可以去以下地址下载,或者自行去官网下载,下面都有介绍. 所有安装包地址:http://download.csdn.net/detail/carboncomputer/9238037 原文地 ...

  6. Microsoft .NET Pet Shop 4

    Microsoft .NET Pet Shop 4:将 ASP.NET 1.1 应用程序迁移到 2.0 299(共 313)对本文的评价是有帮助 - 评价此主题 发布日期 : 2006-5-9 | 更 ...

  7. html样式表极大地提高了工作效率

    样式表极大地提高了工作效率 样式表定义如何显示 HTML 元素,就像 HTML 3.2 的字体标签和颜色属性所起的作用那样.样式通常保存在外部的 .css 文件中.通过仅仅编辑一个简单的 CSS 文档 ...

  8. Redis 配置文件 Redis.conf 参数说明

    Redis 配置文件 Redis.conf 参数说明 参数名 参数说明 参数实例 daemonize 是否以后台守护进程运行,默认为 no, 取值 yes, no   daemonize no     ...

  9. JS单词形式的运算符

    1.void 运算表达式并忽略其返回值,比如void (1+2),void (0) <html> <head> <meta http-equiv="conten ...

  10. NUMBER_GET_NEXT

    1. SNRO /SNUM创建一个流水号对象 CALL FUNCTION 'NUMBER_RANGE_ENQUEUE' EXPORTING OBJECT = '' EXCEPTIONS FOREIGN ...