条款13:尽量使用vector和string来代替动态分配的数组
无论何时,你发现你自己准备动态分配一个数组(也就是,企图写“new T[...]”),你应该首先考虑使用一个vector或一个string。(一般来说,当T是一个字符类型的时候使用string,否则使用vector,但我们在本条款的后面将遇到的情况中,vector<char>可能是一个合理的设计选择。)
条款14:使用reserve来避免不必要的重新分配
reserve成员函数允许你最小化必须进行的重新分配的次数
有时候令人困惑的四个相关成员函数:
● size()告诉你容器中有多少元素。它没有告诉你容器为它容纳的元素分配了多少内存。
● capacity()告诉你容器在它已经分配的内存中可以容纳多少元素。那是容器在那块内存中总共可以容纳多少元素,而不是还可以容纳多少元素。如果你想知道一个vector或string中有多少没有被占用的内存,你必须从capacity()中减去size()。如果size和capacity返回同样的值,容器中就没有剩余空间了,而下一次插入(通过insert或push_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到至少7倍char*指针的大小。
● 新字符串值的建立可能需要0、1或2次动态分配。
● string对象可能是或可能不共享字符串的大小和容量信息。
● string可能是或可能不支持每对象配置器。
● 不同实现对于最小化字符缓冲区的配置器有不同策略。
条款16: 如何将vector和string的数据传给遗留的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>提供的性能的需要的替代数据结构。