EC3-1:Choose your containers with care

C++提供了一些容器:
标准STL序列容器:vector, string, deque, list.
标准STL关联容器:set, multiset, map, multimap.
非标准序列容器:slist, rope.
非标准关联容器:hash_set, hash_multiset, hash_map, hash_multimap.
vector作为string的替代(详见EC3-13)
vector作为标准关联容器的替代(详见EC3-23)
标准非STL容器:数组, bitset, valarray, stack, queue, priority_queue.

算法复杂度很重要,但除此之外需要考虑的还有很多。

首先引入一种对容器分类的方法。
连续内存容器:把元素放在一块或多块内存中,每块有多个元素,插入或删除元素时,同块的其他元素要向前或后移动以让出空间或填充被删除元素的空隙。这会影响效率和异常安全性(见EC3-5,EC3-14)。连续内存容器有:vector, string, deque, rope。
基于节点的容器:每个内存块只有一个元素,插入删除只影响指向节点的指针,元素的值不移动。基于节点的容器有:list, slist, 所有标准关联容器, 非标准哈希容器。

需要在容器任意位置插入新元素,则选择序列容器。
关心容器中元素的排序,则避免哈希容器(反之则尽量选择复杂度较优的哈希容器)。
需要标准C++的容器,则排除了哈希容器,slist,rope。
需要随机访问迭代器,则选择在vector, deque, string,rope中。
需要双向迭代器,则避免slist。
插入或删除元素时避免原元素的移动,则选择连续内存容器。
布局和C兼容,则只能选择vector(详见EC3-16)。
需要查找速度,则选择哈希容器,排序的vector或标准关联容器。
在意引用计数,则避免string和rope。
需要回滚能力,则选择基于节点的容器。
需要迭代器,指针,引用变为无效的次数最少,则选择基于节点的容器。
迭代器是随机访问类型,没有删除且插入只在末尾时指针和引用就不会无效,需要这样的属性则选择deque。

所以,算法复杂度很重要,但不是问题的全部。

最后,在STL之外,还有更多选择,请仔细考虑所有选择。

你可能感兴趣的:(其他)