通用概念。
顺序容器基本理解:按照顺序储存元素,并提供 元素具体操作(迭代器或其他) 和 顺序访问元素 的能力。
个人理解:
1)顺序:按照添加的先后次序排序。但,先进优先,还是后进优先取决于具体容器。
个人应用:
1)在可以使用容器时,尽量使用容器。因为你无法保证自己的算法优于整个开发组。
2)选择容器的基本原则(from C+ primer):
1,在不知道如何选择时,使用vector。
2,单个元素需求内存很小,内存紧缺时,不要使用list/forward_list。
3,已知添加操作时,尽量使用符合 原设计思想 的容器。例如:频繁的随机插入/删除,使用list/forward_list,而尽量不使用vector,deque。
4,举一反三:混合添加操作时,选择最频繁的添加操作,作为选择容器的标准。例如:100次后置添加 + 一次随机操作时,选择vector,deque。反之:list/forward_list。
5,举一反三:添加操作在某些阶段存在统一,则可以进行容器替换。例如:输入元素使用 list。输入结束后,使用vector储存(copy list),再进行读取操作。
3)尽量使用迭代器来操作容器——虽然有些容器支持下标。、
一些细节:
1)容器可以保存容器(嵌套)。
vector容器:
一些细节:
1)使用连续内存保存元素。
2)可以下标访问元素(速度快)。可是当作动态数组使用。
3)中间添加/删除元素耗时。因,需要重新调整内存。同时会导致迭代器失效(大概率)。
4)添加新元素时(push_back),也可能重新分配内存。导致迭代器失效(中概率)。
5)容器存在增长方式:超出时,按照一定量增加内存,以保证添加数个元素后,才需要再次分配内存。量值可通过函数设定(不建议)。
deque容器:
一些细节:
1)使用连续内存保存元素。
2)不确定是否可以使用下标访问。
list容器:
一些细节:
1)使用链表的思想。
2)额外内存开销相对较大。
3)不支持下标。
forward_list容器:
一些细节:
1)和list容器类似。
2)主要特征:单向链表。
array容器:
一些细节:
1)对数组的封装。加强安全性。
2)有数组的特性。
string容器:
一些细节:
1)使用连续内存保存元素。
2)用来保存字符串。
适配器:
概念:一个适配器是一种机制。通过适配器,可以使容器从行为上模仿其他数据结构。
顺序容器可用适配器:stack, queue, priority_queue。
个人理解:
1)用来模拟一些通用的数据结构。如上:堆栈,队列。
疑惑:
1)为何不直接做成容器?