《Effective STL》读书笔记

http://www.linuxso.com/linuxbiancheng/2462.html

 

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

C++所提供的容器类型有如下几种:

  • 标准STL序列容器 vector string deque list
  • 标准STL关联容器 set multiset map multimap
  • 非标准序列容器 slist rope
  • 非标准关联容器 hash_set hash_multiset hash_map hash_multimap
  • vector<char>作为string的替代
  • vector作为标准关联容器的替代
  • 非标准的STL容器 array bitset valarray stack queue priority_queue

标准容器中的vector string和list比较熟悉。
deque是double ended queue,提供了与vector一样的随机访问功能,但同时对头尾元素的增删操作提供了优化。
set和multiset中的数据都是顺序排列的,数据值本身就是键值,set中的数据必须唯一而multiset没有这样的限制。
map和multimap中的数据对按照键值顺序排列,map中不允许出现重复的key,而multimap中可以用相同的key对应不同的value。
slist是single linked list,与STL中标准的list之间的区别就在于slist的iterator是单向的,而list的iterator是双向的。
rope用于处理大规模的字符串。
hash_set hash_multiset hash_map hash_multimap利用hash算法对相对应的关联容器进行了优化。
bitset是专门用来存储bit的容器。
valarray主要用于对一系列的数字进行高速运算。
priority_queue类似于heap,可以高效的获取最高priority的元素。

  • 连续内存容器,动态申请一块或多块内存,每块内存中存储多个容器中的元素,当发生插入或删除操作时,要对该内存中的其他元素进行新移动操作,这会降低效率。vector,string,rope都是连续内存容器。
  • 基于节点的容器,为容器中的每一元素申请单独的内存,元素中有指针指向其他的元素,插入和删除的操作只需要改变指针的指向。缺点在于占用内存相对连续内存容器较大。list, slist, 关联容器以及hash容器都是基于节点的容器。

2. 当心与容器无关(Container-independent)的代码这个错觉

STL是基于泛型思想的,
数组泛化为Container,并根据它们所包含的对象类型而进行参数化
函数泛化为Algorithms,并根据它们所使用的iterators类型而进行参数化
指针泛化为iterators,并根据它们所指向的对象类型而进行参数化

Container分为 sequence container(序列容器), 和 associative container(关联容器)
连续内存的container提供随机存取的iterators, 标准基于结点的container提供了双向iterators

试图写一个与container无关的代码,如果试图写一个可以让Sequence containers和Associative containers同时运作的软件几乎是没有意义的。


解决方案有两种:

1.使用typedef
2.

 

你可能感兴趣的:(《Effective STL》读书笔记)