Effective STL 重读笔记——vector和string

条款13:尽量使用vectorstring来代替动态分配的数组

      无论何时,你发现你自己准备动态分配一个数组(也就是,企图写“new T[...]”),你应该首先考虑使用一个vector或一个string。(一般来说,当T是一个字符类型的时候使用string,否则使用vector,但我们在本条款的后面将遇到的情况中,vector<char>可能是一个合理的设计选择。)

条款14:使用reserve来避免不必要的重新分配

      reserve成员函数允许你最小化必须进行的重新分配的次数

      有时候令人困惑的四个相关成员函数:

      size()告诉你容器中有多少元素。它没有告诉你容器为它容纳的元素分配了多少内存。

capacity()告诉你容器在它已经分配的内存中可以容纳多少元素。那是容器在那块内存中总共可以容纳多少元素,而不是还可以容纳多少元素。如果你想知道一个vectorstring中有多少没有被占用的内存,你必须从capacity()中减去size()。如果sizecapacity返回同样的值,容器中就没有剩余空间了,而下一次插入(通过insertpush_back等)会引发上面的重新分配步骤。

resize(Container::size_type n)强制把容器改为容纳n个元素。调用resize之后,size将会返回n。如果n小于当前大小,容器尾部的元素会被销毁。如果n大于当前大小,新默认构造的元素会添加到容器尾部。如果n大于当前容量,在元素加入之前会发生重新分配。

reserve(Container::size_type n)强制容器把它的容量改为至少n,提供的n不小于当前大小。这一般强迫进行一次重新分配,因为容量需要增加。(如果n小于当前容量,vector忽略它,这个调用什么都不做,string可能把它的容量减少为size()n中大的数,但string的大小没有改变。在我的经验中,使用reserve来从一个string中修整多余容量一般不如使用“交换技巧”,那是条款17的主题。)

 

条款15:小心string实现的多样性

实际上每个string实现都容纳了下面的信息:

● 字符串的大小,也就是它包含的字符的数目。

● 容纳字符串字符的内存容量。(字符串大小和容量之间差别的回顾,参见条款14。)

● 这个字符串的值,也就是,构成这个字符串的字符。

另外,一个string可能容纳

● 它的配置器的拷贝。对于为什么这个域是可选的解释,转向条款10并阅读关于这个古怪的管理分配器的规则。

依赖引用计数的string实现也包含了

● 这个值的引用计数。

四种不同的string实现使用的数据结构

不同的实现以不同的方式从它们的设计灵活性中得到好处。让我们总结一下:

● 字符串值可能是或可能不是引用计数的。默认情况下,很多实现的确是用了引用计数,但它们通常提供了关闭的方法,一般是通过预处理器宏。条款13给了一个你可能要关闭的特殊环境的例子,但你也可能因为其他原因而要那么做。比如,引用计数只对频繁拷贝的字符串有帮助,而有些程序不经常拷贝字符串,所以没有那个开销。

string对象的大小可能从1到至少7char*指针的大小。

● 新字符串值的建立可能需要012次动态分配。

string对象可能是或可能不共享字符串的大小和容量信息。

string可能是或可能不支持每对象配置器。

● 不同实现对于最小化字符缓冲区的配置器有不同策略。

 

 

条款16: 如何将vectorstring的数据传给遗留的API

      如果你有一个vector对象v,而你需要得到一个指向v中数据的指针,以使得它可以被当作一个数组,只要使用&v[0]就可以了。对于string对象s,相应的咒语是简单的s.c_str()

      if(!v.empty())

      {

      doSomething(&v[0], v.size());

}

      doSomething(s.c_str());

条款17:使用“交换技巧”来修整过剩容量

      修整你 vector过剩容量的方法:vector<Contestant>(contestants).swap(contestants);

      修整你 string 过剩容量的方法:string<Contestant>(contestants).swap(contestants);

条款18:避免使用vector<bool>

      做为一个STL容器,vector<bool>确实只有两个问题。第一,它不是一个STL容器。第二,它并不容纳bool

除此以外,就没有什么要反对的了。

vector<bool>vector的特例化

      在内部,vector<bool>使用了与位域(bitfield)等价的思想来表示它假装容纳的bool

      重要的是:

vector<bool>不满足STL容器的必要条件,你最好不要使用它;而deque<bool>bitset是基本能满足你对vector<bool>提供的性能的需要的替代数据结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值