所有的 STL 容器都是有用的,但对于大多数 C++ 程序员,你会发现使用 vector 和 string 的时候回更多一些。这是可以想见的。设计 vector 和 string 的目的就是为了代替在大多数应用中使用的数组,而数组的用途是如此广泛,以至于它被包含在从 COBOL 到 Java 的所有成功的商业编程语言中。
本章的条款涵盖了 vector 和 string 的多个方面。首先会讨论为什么值得从数组转到 vector 和 string,然后探究提高 vector 和 string 效率的途径,指出不同 string 实现的重要区别,研究如何把 vector 和 string 的数据传递给只能理解 C 的 API,并学会怎样避免不必要的内存分配。最后,我们将研究一个有指导性的特例,vector < bool>,一个功能不完全的 vector。
本章中的条款将帮助你理解这两个最常用的容器,并改进对它们的使用。在学完本章之后,你将会知道如何更好地使用它们。
第13条:vector 和 string 优先于动态分配的数组
如果你正在动态地分配数组,那么你可能要做更多的工作。为了减轻自己的负担,请使用 vector 或 string。
第14条:使用 reserve 来避免不必要的重新分配
首先,若能确切知道或大致预计容器中最终会有多少元素,此时可以使用 reseve。
其次,先预留足够大的空间,然后,当把所有数据都假如以后,再去除多余的容量。
第15条:注意 string 实现的多样性
string 的值可能会被引用计数,也可能不会。
string 对象大小的范围可以是 char* 指针大小的 1 倍到 7 倍。
创建一个新的字符串值可能需要零次、一次或两次动态分配内存。
string 对象可能共享,也可能不共享其大小和容量信息。
string 对象可能支持,也可能不支持针对单个对象的分配子。
不同的实现堆字符内存的最小分配单位有不同的策略。
第16条:了解如何把 vector 和 string 数据传给旧的 API
先让 C API 把数据写入到一个 vector 中,然后把数据复制到期望最终写入的 STL 容器中。
第17条:使用 “swap 技巧” 除去多余的容量
在做 swap 的时候,不仅两个容器的内容被交换,同时它们的迭代器、指针和引用也将被交换(string除外)。
第18条:避免使用 vector < bool>
首先,它不是一个 STL 容器。
其次,它并不存储 bool。