CH6
1. 顺序容器(sequence container)拥有由单一类型元素组成的一个有序集合,两个主要的顺序容器是list和vector。
2. 关联容器(associative container)支持查询一个元素是否存在,并且可以有效地获取元素;两个基本的关联容器类型是map映射和set集合;map是一个键/值(key/value)对,键(key)用于查询,而值(value)包含我们希望使用的数据;set包含一个单一键值,有效支持关于元素是否存在的查询。
3. vector表示一段连续的内存区域,每个元素被顺序存储在这段内存中。
4. list表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历。
5. 选择顺序容器类型的一些准则:1)如果我们需要随机访问一个容器,则vector要比list好得多;2)如果我们已知要存储元素的个数,则vector又是一个比list好的选择;3)如果我们需要的不只是在容器两端插入和删除元素,则list显然要比vector好;4)除非我们需要在容器首部插入和删除元素,否则vector要比deque好。
6. 一个需要动态增长的vector必须分配一定的内存以便保存新的序列、按顺序拷贝旧序列的元素以及释放旧的内存。
7. 容量是指在容器下一次需要增长自己之前能够被加入到容器中的元素的总数(容量只与连续存储的容器相关,例如:vector、deque或string;list不要求容量)。
8. 无论是list还是vector,对于已定义拷贝构造函数的类来说,插入这样的类的元素都需要调用拷贝构造函数。随着每次重新分配内存,vector必须为每个元素调用拷贝构造函数;而且在释放原来的内存时,它要为每个元素调用其相关类型的析构函数。
9. 容器对象的定义以容器类型的名字开始,后面是所包含的元素的实际类型。
10. 除了用相关联的初始值来初始化每个元素外,我们还可以指定一个值,并用它来初始化每个元素。
11. 我们能够定义的容器的类型有三个限制:1)元素类型必须支持等于操作符;2)元素类型必须支持小于操作符;3)元素类型必须支持一个缺省值(对于类类型,即指缺省构造函数)。
12. 迭代器(iterator)提供了一种一般化的方法,对顺序或关联容器类型中的每个元素进行连续访问。
13. 每种容器类型都提供一个begin()和一个end()成员函数:1)begin()返回一个iterator,它指向容器的第一个元素;2)end()返回一个iterator,它指向容器的末元素的下一个位置。
14. iterator算术运算只适用于vector或deque,而不适用于list,因为list的元素在内存中不是连续存储的。
15. 容器对象也可以用“由一对iterator标记的起始元素和未元素后一位置之间的拷贝”来初始化。
16. 除了一对iterator之外,两个指向内置数组的指针也可以被用作元素范围标记器(range marker)。
17. 删除容器内元素的一般形式是一对erase()方法:一个删除单个元素,另一个删除由一对iterator标记的一段范围内的元素。
18. 赋值操作符使用针对容器元素类型的赋值操作符,把右边容器对象中的元素依次拷贝到左边的容器对象中。
19. 把所有容器类型的公共操作抽取出来,形成一个通用算法集合,它能够被应用到全部容器类型以及内置数组类型上;这组通用算法被称作泛型算法泛型算法;泛型算法通过一个iterator对,被绑定到一个特殊的容器上。
20. getline()读取istream对象,向string对象插入字符,包括空格,直到遇到分割符、文件结束,或者被读入的字符序列等于string对象的max_size()值,在该点处读入操作失败。
21. find_last_of()查找字符串中的“与搜索字符串任意元素相匹配”的最后一个字符;find_last_not_of()查找字符串中的与搜索字符串任意字符全不匹配的最后一个字符。
22. 在map(也叫关联数组,associative array)中,提供一个“键/值”对;键用来索引map,而值用作被存储和检索的数据。