Effective stl 第一章 容器

第1条:慎重选择容器类型

标准STL序列容器:vector, string, deque, list

标准STL关联容器:set, multiset, map, multimap

非标准序列容器slist和rope。slist单项链表,rope本质上是一”重型“string

非标准关联容器hash_set、hash_multiset、hash_map和hash_multimap

vector<char>作为string的替代

vector作为标准关联容器的替代

几种标准的非STL容器,包括数组、bitset、valarray、stack、queue、priority_queue

数组也可以被用于STL算法,因为指针可以被用作数组的迭代器


vector是默认应使用的序列类型;

当需要频繁的在序列中间做插入和删除操作时,应使用list;

当大多数插入和删除操作发生在序列的头部和尾部时,选择deque


连续内存容器有vector、string、rope

基于节点的容器有:list、slist, 关联容器


参考标准:

1、是否需要在容器的任意位置插入新元素?如果需要,选择序列容器,关联容器是不行的

2、是否关心容器中的元素使排序的?如果不关心,散列容器可以考虑,否则,避免散列容器

3、容器必须是标准C++中的一部分吗?如果是,则排除了散列容器、slist和rope

4、需要哪种类型的迭代器?随机访问迭代器:vector、deque、string,或rope,  双向迭代器:避免slist和散列容器

5、当发生元素的插入或删除操作时,避免移动容器中原来的元素是否很重要?如果是,则避免连续内存的容器

6、容器中的数据布局是否需要和C兼容?如果需要,只能选择vector

7、元素的查找速度是否是关键的考虑因素?如果是,则考虑散列容器,排序的vector,标准关联容器

8、如果容器内部使用了引用计数技术,是否介意?如果是,则避免使用string,因为许多string的实现都使用了引用计数,rope也需要避免,因为权威的rope实现是基于引用计数的,可以考虑vector<char>

9、对插入和删除操作,需要事务语义吗?选择基于结点的容器,如果对多个元素的插入操作需要,则选择list,因为在标准容器中,只有list对多个元素的插入操作提供了事务语义。

10、

你可能感兴趣的:(Effective stl 第一章 容器)