点击查看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技巧去清空vector和string。

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。
  • 使用bitset,bitset使用紧凑表示,无法动态增删。

###《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. poll()

    # include < sys/ poll. h> int poll ( struct pollfd * fds, unsigned int nfds, int timeout) ; 和s ...

  2. [iOS基础控件 - 4.3] APP列表 xib的使用

    A.storyboard和xib 1.storyboard: 相对xib较重量级,控制整个应用的所有界面 2.xib: 轻量级,一般用来描述局部界面   B.使用 1.新建xib文件 New File ...

  3. jquery事件函数和原生事件绑定函数中return false的区别

    一直听说jquery中事件函数返回false,相当于调用了event.preventDefault()和event.stopPropagation()两个方法,今天就想看看dom中0级.1级.2级事件 ...

  4. putty 连接ubuntu

    1.安装ssh   sudo apt-get install openssh-server 2.查看ssh服务是否启动 sudo ps -e |grep ssh   3.如果没有启动,输入" ...

  5. Volley使用指南第一回(来自developer.android)

    最近闲来想看看android网络方面的东西.google在2013年发布了一个叫做Volley的网络请求框架,我看了一下官网,居然在training里面就有教程.首先,英文的东西看着 还是挺不爽的,特 ...

  6. Asp.Net事务和异常处理:

    Asp.Net事务和异常处理: 一.什么是事务处理? 事务处理是一组组和成逻辑工作单元的数据库操作,虽然系统中可能会出错,但事务将控制和维护每个数据库的一致性和完整性. 如果在事务过程中没有遇到错误, ...

  7. EntityFramework 连接数据库出错

    本文转载:http://www.cnblogs.com/shuang121/archive/2012/03/19/2406121.html 总结:选择“是”时,连接字符串的密码会暴露出来,“否”的时候 ...

  8. 判断数组(array)中是否包含某个字符(contains)

    $a="a","","b" $a -contains "a" 返回 $true $a -notcontains &quo ...

  9. Android AndroidManifest 清单文件以及权限具体解释

    每一个Android应用都须要一个名为AndroidManifest.xml的程序清单文件,这个清单文件名称是固定的而且放在每一个Android应用的根文件夹下.它定义了该应用对于Android系统来 ...

  10. C#WinForm应用程序实现自动填充网页上的用户名和密码并点击登录按钮【转载】

    使用WebBrowser控件,在documentComplete事件处理器里写 HtmlElement name = webBrowser1.Document.GetElementById(" ...