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;

 

 

 

 

 

  

posted @ 2018-11-21 20:12  KidyCharon  阅读(201)  评论(0编辑  收藏  举报