1. 任何insert 或push 操作都可能导致迭代器失效,当编写循环将元素插入到vector 或deque 容器中时,程序必须确保迭代器在每次循环后都得到更新
2. 容器的比较是基于容器内元素的比较,所有容器都通过比较其元素对来实现关系运算
容器的比较使用了元素类型定义的同一个关系操作符:两个容器做 != 比较使用了其元素类型定义的 != 操作符
3. 容器中 begin() 和 end() 返回的迭代器,front() 和 back() 返回的是引用(别名)
4. swap() 操作
该操作不会删除或插入任何元素,而且保证在常量的时间内实现交换,因为容器内没有移动任何元素,所以迭代器不会失效
5. 比起 list 和 deque , vector 的增长效率会更高
6. capacity 操作获取在容器需要分配更多的存储空间之前能够存储的元素总数,而 reserve 操作告诉 vector 容器应该预留多少元素的存储空间
7. 通常来说,除非找到使用其他容器的更好理由,否则 vector 容器都是最佳选择
8. 与 vector 一样,string 的字符也是连续存储的,因此系统还允许使用下标而不是迭代器指定插入位置
9. 标准库迭代器都支持解引用( * )操作符和箭头( -> )操作符,用于检查迭代器指向的元素值
10.关联容器和顺序容器的本质差别
关联容器通过键( key )存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素
11.在应用中,键类型必须定义 < 操作符,而且该操作符能 “正确地工作”
12.对于 map 类型,其元素类型( value_type )是 pair 类型,它的值成员可以修改,但键成员不可以修改
13.使用下标访问 map 与使用下标访问数组或 vector 的行为完全不同
用下标访问不存在的元素将导致在 map
14.在获得指向 set 中某元素的迭代器后,只能对其做读的操作,而不能写操作
15.在 multimap 和 multiset 容器中,如果某个键对应多个实例,则这些实例在容器中将相邻存放,迭代遍历multimap 和 multiset 容器时,可保证依次返回特定键所关联的所有的元素
16.在 multimap中,在同一个键上调用 lower_bound 和 upper_bound,将产生一个迭代器范围,指示出该键所关联的所有元素,如果该键在容器中存在,则会获得两个不同的迭代器
lower_bound 返回的迭代器指向该键关联的第一个实例,而 upper_bound 返回的迭代器则指向最后一个实例的下一个位置,如果该键不在 multimap 中,这两个操作将返回同一个迭代器,指向依据元素排列顺序该键应该插入的位置
17.泛型算法本身从不执行容器操作,只是单独依赖迭代器和迭代器操作实现
18.使用泛型算法包含 algorithm 头文件,使用算术算法包含 numeric 头文件
19.迭代适配器使用一个对象作为实参,并生成一个适应其实参行为的新对象
20.算法不直接修改容器的大小,如果需要添加或删除操作,则必须使用容器操作
21.为了以降序排列 vector ,只需向 sort 传递一对反向迭代器
22.反向迭代器用于表示范围,而所表示的范围是不对称的
这个事实可推导出一个重要结论:使用普通的迭代器对反向迭代器进行初始化和赋值时,所得到的迭代器并不是指向原迭代器所指向的元素
23.类类型被称为抽象数据类型
抽象数据类型将数据(即状态)和作用于状态的操作视为一个单元
24.将关键字 const 加在形参表之后,就可以将成员函数声明为常量
1 double avg_price() const;
const 成员不能改变其所操作的对象的数据成员, const 必须同时出现在声明和定义中,若只出现在其中一处,就会出现编译错误
25.不在类定义体内定义的 inline 成员函数,其定义通常放在有类定义的同一源文件中
26.不能从 const 成员函数返回指向类对象的普通引用, const 成员函数只能返回 *this 作为 一个 const 引用
27.在类的作用域外,成员只能通过对象或指针分别使用成员访问操作符 . 和 -> 来访问
28.如果函数在类定义体之外定义,则用于返回类型的名字在类作用域之外,如果返回类型使用类定义的类型,则必须使用完全限定名
29.必须在类中先定义类型名字,才能将它们用作数据成员的类型,或者成员函数的返回类型或形参类型
30.构造函数分两个阶段:1) 初始化阶段 2) 普通的计算阶段 计算阶段由构造函数函数体中的所有语句组成
不管成员是否在构造函数初始化列表中显式初始化,类类型的数据成员总是在初始化阶段初始化,初始化阶段发生在计算阶段开始之前