Effective_STL 学习笔记(一)仔细选择你的容器
本章关注的是可以适合所有STL容器的指导方针:
选择适当容器时应该面对的约束;
避免产生为一个容器类型写的代码也可以用于其他容器类型的错觉;
容器里对象拷贝操作的重要性;
当指针或auto_ptr存放在容器中时出现的难点;
删除输入和输出;
可不可以使用自定义分配器;
达到最高效率的技巧和考虑在多线程环境下容器的使用
C++容器回顾:
标准STL序列容器:vector、string、deque和list;
标准STL关联容器:set、multiset、map和multimap;
非标准容器序列slist和rope。slist是一个单向链表,rope本质是一个重型字符串;
非标注关联容器:hash_set、hash_multiset、hash_map和hash_multimap;
vector<char> 可以作为string的替代品;
vector 作为标准关联容器的替代品;
几种标准非STL容器:数组、bitset、valarray、stack、queue和priority_queue
vector、deque 和 list 之间做选择的指导方案:
根据复杂度,vector 是一种可以默认使用的序列类型;
当频繁的对序列中部进行插入和删除时应该使用 list;
当大部分插入和删除发生在序列的头部和尾部时可以选择 deque;
连续内存容器和基于节点的容器的区别:
连续内存容器(也叫作基于数组的容器)在一个或多个(动态分配)的内存块中保存他们的元素:
vector、string 和 deque
基于节点的容器在每个内存块(动态分配)中只保存一个元素:
list 和 slist,所有标准关联容器也是(典型实现是平衡树)
大多数关于容器间选择问题:
1. 可以在容器的任意位置插入一个新元素,则需要序列容器,关联容器做不到;
2. 不关心元素在容器中的顺序,散列容器可行,否则避免使用散列容器;
3. 必须使用C++标准容器时,可以除去散列容器、slist 和 rope;
4. 考虑迭代器,如果必须是随机访问迭代器,只限于 vector、deque 和 string,也可考虑 rope;
5. 当插入和删除数据时,如果非常在意容器内的元素移动,则放弃使用内存连续容器;
6. 容器中的数据的内存需要兼容 C 时,只能使用 vector;
7. 查找速度很重要时,多考虑散列容器,排序的 vector 和标准的关联容器;
8. 如果介意容器底层使用引用计数,则避开 string、rope,可以考虑使用 vector<char>;
9. 如果需要插入和删除的事务性语义,则需要使用基于节点的容器,list 是唯一提供多元素插入事务性语义的标准容器;
10. 如果需要把迭代器、指针和引用的失效次数减到最少,使用基于节点的额容器;
11. 可以随机访问迭代器,只要没有删除且插入只发生在容器的结尾,使用 deque;