第九章:顺序容器
笔记
1. 一个容器就是一些特定类型对象的集合。顺序容器(sequential container)为程序员提供了控制元素存储和访问顺序的能力。
2. 容器分为有序容器和无序容器;访问分为顺序访问和随机访问。
3. forward_list和array是新C++标准增加的类型。与内置数组相比,array是一种更安全、更容易使用的数组类型。与内置数组类似,array对象的大小是固定的。
4. 通常,使用vector是最好的选择,除非你有很好的理由选择其他容器。
5. 容器操作中类型别名:iterator、const_iterator、size_type、difference_type、value_type、reference(元素类型的左值)、const_reference(元素的const左值类型)。
6. 一个迭代器范围(iterator range)有一对迭代器表示,两个迭代器分别指向同一个容器中的元素或者是尾元素之后的位置。这种元素范围被称为左闭合区间(left-inclusive interval),数学形式为 [begin, end)。
7. 如果需要元素类型,可以使用容器的value_type。如果需要元素类型的一个引用,可以使用reference或const_reference。这些元素相关的类型别名在泛型编程中非常有用。
8. begin()和end()有多个版本,带r的版本返回反向迭代器;以c开头的版本则返回const迭代器。不以c开头的函数都是被重载过的。当我们对一个非常量对象调用这些成员时,得到的是返回iterator的版本。只有在对一个const对象调用这些函数时,才会得到一个const版本。
9. 当不需要写访问时,应使用cbegin()和cend()。
10. 标准库array:
array<int, 42> // 类型为:保存42个int的数值 array<string, 10> // 类型为:保存10个string的数组
11. 关系运算符左右两边的运算对象必须是相同类型的容器且必须保存相同类型的元素。
12. 必须清楚不同容器使用不同的策略来分配元素空间,而这些策略直接影响性能。
13. 新标准引入了三个新成员emplace_front、emplace和emplace_back,这写操作构造而不是拷贝元素。
// 在c的末尾构造一个Sales_data对象 c.emplace_back("978-059035", 25, 15.99); // 使用三个参数的Sales_data构造函数 c.push_back("978-059035", 25, 15.99); //错误:没有接受三个参数的push_back函数 c.push_back(Sales_data("978-059035", 25, 15.99); // 正确:创建一个临时的Sales_data对象传递给push_back
emplace函数在容器中直接构造函数。传递给emplace函数的参数必须与元素类型的构造函数相匹配。
14. 容器操作可能使迭代器失效。
15. 不要保存end返回的迭代器。
术语
适配器(adaptor)、容器(container)、迭代器范围(iterator range)、左闭合区间(left-inclusive interval)