可选容器:
- 标准STL序列容器:vector,list,sequence
- 标准STL关联容器:set,multiset,map,mutimap
- 非标准序列容器slist与rope
其中,slist是单向链表,rope为重型string- 非标准关联容器hash_set,hash_mutiset,hash_map,hash_mutimap
- vector
作为string的替代 - 标准非STL容器,诸如array,bitset,stack之类
在选择容器时需要顾虑的有很多,vector,list,deque之间的选择也就不说了,大家都懂。
根据内部元素物理地址的相互关联性,STL容器可以分为两类
1.连续内存容器
2.基于节点的容器
这两种容器其实也说得很多了,在这里要强调的是rope是连续的,而关联容器和散列容器是基于节点的。
选择容器时需要判断的一些依据
- 是否需要在任意位置插入?
如果是则不可选择关联容器- 容器内元素是否需要排序?
是则不可选择散列容器- 是否必须是标准c++?
否则不可使用slist,rope与散列容器- 迭代器是否有要求?
随机访问迭代器需要vector,string,deque.slist不可以使用双向迭代器- 是否需要频繁插入删除?
是则选择基于节点- 是否需要兼容c接口?
是则选择vector- 是否对查找速度有要求?
是则选择散列容器,sorted vector以及标准关联容器- 是否介意容器内部的引用计数?
是则需要避免string与rope- 插入和删除如果失败是否需要回滚?
是则需要选择基于节点的容器,如果是区间形式的操作,那只能使用list.- 是否需要尽可能少地让迭代器失效?
是则选择基于节点的容器(他们的插入和删除操作从来不会让迭代器,指针,或者引用失效)
deque的插入操作仅发生在末尾时,迭代器可能失效,但指针和引用不会失效,它是唯一会有这种情况的容器。