点击查看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. spring框架中一个跟String的trim方法一样的方法

    @Test public void testTrimWhitespace() throws Exception { assertEquals(null, StringUtils.trimWhitesp ...

  2. hdoj 2203 亲和串

    亲和串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. 最清晰的ios消息推送机制教程

    研究了一下Apple Push Notification Service,实现的很简单,很环保.原理如下 财大气粗的苹果提供了一堆服务器,每个ios设备和这些服务器保持了一个长连接,ios版本更新提示 ...

  4. IOS开发--C语言入门--如何结合Terminal和Vim开发C语言程序

    一直以来都想着挤出时间,记录开发之路的点点滴滴(现在记录已成回忆),和大家一起分享,开发人员总是在沟通和相互学习中提高自身的能力.路过的大神也好初学者也罢,若发现文章中又观点不对的,还望大家指出. 现 ...

  5. 【STL源码学习】STL算法学习之三

    第一章:前言 数量不多,用到的时候会很爽. 第二章:明细 STL算法中的又一个分类:分割:将已有元素按照既定规则分割成两部分.  is_partitioned 函数原型: template <c ...

  6. 剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)

    题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 ...

  7. hdu3589 Jacobi symbol(二次剩余 数论题)

    本题的注意点:n=p1*p2*p3......Pm 解法:直接利用公式a^((p-1)/2)=(a/p)mod p 即可求解. #include<stdio.h> #include< ...

  8. 46 关于Linux的I/O重定向

    I/O重定向是一个过程,这个过程捕捉一个文件.或命令.或程序.或脚本.甚至代码块(code block)的输出,然后把捕捉到的输出,作为输入发送给另外一个文件.或命令.或程序.或脚本. 1.I/O重定 ...

  9. PROC简单的用例--VC连接ORACLE

    操作系统:windows 7 数据库版本号:oracle 10g VS版本号:VS2010 前言:连接ORACLE有许多方法,这里只PROC外壳,说明如何连接oracle,有事吗,希望你告诉我指出,一 ...

  10. Android 获取手机SIM资料详解

    TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取 ...