顺序容器
- C++程序应该使用标准库容器,而不是更原始的数据结构如内置数组
- 通常,使用vector是最好的选择,除非有很好的理由选择其他容器
- 顺序容器类型
● vector,可变大小数组,快速随机访问,尾部插入删除快
● deque,双端队列,快速随机访问,头尾插入删除快
● list,双向链表,双向顺序访问,任何位置插入删除快
● forward_list,单向链表,单向顺序访问,任何位置插入删除快
● string,与vector类似,专门存储字符,快速随机访问,尾部插入删除快 - 选择容器的基本原则,p293
- 容器迭代器支持的所有操作:P56
● *iter
● iter->mem
● ++iter
● --iter
● iter1 == iter2
● iter1 != iter2 - forward_list不支持–iter
- 迭代器支持的运算:这些运算只用于string、vector、deque、array的迭代器。
- 迭代器begin和end必须指向相同的容器,end不能指向begin之前的位置
- 迭代器范围是左闭合区间
- 当不需要写访问时,应该使用cbegin 和cend。
- 使用一个容器来初始化另一个容器的时候,两容器的类型与元素类型必须完全匹配。使用迭代器参数来初始化容器时则无需匹配
- 只有顺序容器的构造函数接受大小参数,关联容器不接受
- 使用array类型,必须同时指定元素类型和大小
- 内置数组不支持拷贝或赋值。P102
- array也是标准库的,与数组的区别:可以拷贝或者赋值
- array类型不支持assign,也不允许用花括号包围的值列表进行赋值。
- 给array类型赋值,赋值号左右两边的运算对象必须具有相同的类型
- swap的速度比拷贝快
- assign操作不适用于array和关联容器
- array的大小固定,所以不能动态添加删除元素
- forward_list不支持push_back & emplace_back
- vector & string 不支持push_front & emplace_front
- 向一个vector、string、deque插入元素会使所有指向容器的迭代器、指针、引用失效
- 容器元素是拷贝
- 将元素插入到vector、string、deque是合法的,但是这样做很耗时
- insert返回指向新添加的元素的迭代器
- emplace函数在容器中直接构造元素,传递给emplace函数的参数必须与元素类型的构造函数匹配(push,insert都是拷贝,创建临时对象,压入容器)
- 对于一个空容器使用front和back,就像使用一个越界的下标一样
- 如果希望确保下标合法,可以使用at成员函数,如果下标越界,会抛出out_of_range的异常
- 每次改变容器的操作之后都必须重新定位迭代器
- 如果在一个循环中插入、删除deque、string或者vector中的元素,不要缓存end返回的迭代器,因为每次插入删除操作都会使得它失效
- 每个vector都有自己的内存分配策略,但必须遵守的原则是:只有在迫不得已的情况下才重新分配内存
- 修改string的操作。P323
- C风格字符串的函数:strlen,strcmp,strcat,strcpy。传入此类函数的指针必须指向以空字符作为结束的数组
容器适配器 - 除了顺序容器外,标准库还定义了三个顺序容器适配器:stack, queue,priority_queue。
- P330,一个错误。表9.19中,q.pop(),表示删除queue的首元素或priority_queue的最高优先级的元素,但不返回此元素。