因为容器是可增长的,所以可以推测数据区域是另外分配的,而容器自身大小是不变的,即数据区域和容器变量存储的位置不同.
vector,可变大小数组,支持快速随机访问,但在尾部之外位置插入删除元素很慢
deque,同vector,但是支持头部添加删除元素,在中间添加删除元素还是慢
list,双向链表,任意位置添加删除元素都很快,但是只可以遍历访问元素,不支持快速随机访问
forward_list,单项链表
array,固定大小数组,同数组,但更安全方便
string,同vector,但是专门用来存储字符,并提供一些字符处理函数.
新标准库的容器性能很高,不比最精心设计优化过的同类数据结构差,所以应该使用新标准库容器.
如果程序在读取输入时需要在中间插入元素,随后需要随机访问元素,那么可以将数据存储到vector中,然后调用sort函数
如果确实必须在中间插入元素,可以在输入阶段使用list,之后拷贝到vector中.
初始化一个容器,可以传递一个迭代器范围,不要求容器类型是相同的,因为通过迭代器就可以访问范围内的元素,也不要求元素类型相同,只要元素可以转换成对应类型即可.
array类型,大小是类型的一部分.
swap速度比赋值要快,因为本质上swap并不需要赋值对应元素,而是将对应数据结构地址交换即可.当然数组之类的是需要交换实际数据的.
赋值容器,是元素的完全拷贝,比较容器是进行元素的逐个比较,所以只有当元素定义类比较运算是才可以比较
插入或删除元素会使容器的迭代器失效.所以尽量不要修改容器大小,或者总是使用end而不是end的一个拷贝.加入元素是对被加入元素的一个拷贝.
emplace 是用参数直接构造元素,而不是拷贝元素,(所以应该要快?)
如果容器中没有元素,没有检测就使用,有可能访问不存在的元素,和数组下标越界类似.保证有效是程序员的责任.at会考虑越界问题并抛出out_of_range异常,删除元素也不会检测,如果对空元素或空容器 删除 pop 则是未定义的.
forward_list 由于结构原因,使用首前迭代器,删除的元素为指定元素之后的一个元素.ears_after(p)
一些常规下不能使用的限制,需要特殊处理
没有默认构造函数的类