Effective STL (1)

 慎重选择容器类型
 标准序列容器:vector string deque list
 标准关联容器 : set multiset map multimap
 非标准序列容器: slist rope. slist 是一个单向链表,rope 本质上市一个“重型”string
 非标准的关联容器 hash_set hash_nultiset hash_map hash_multimap vector 作为string的替代。 vector 作为标准关联容器的替代
 几种标准的非STL容器 包括 数组、bitset valarray stack queue 和 priority_queue

 容器可分类为 连续内存容器和基于节点的容器

连续内存容器把它的元素存放在一块或多块(动态分配的)内存中,每块内存中存有多个元素。当有新元素插入或已有的元素被删除时,同一内存块中的其他元素要向前或向后移动,以便为新元素让出空间,或者填充被删除元素所留下的空隙。
基于节点的容器在每一个(动态分配的)内存块中只存放一个元素。容器中元素的插入或删除只影响到指向节点的指针,而不影响节点本身的内容,所以当有插入或删除操作时,元素的值不需要移动。

你是否需要在容器的任意位置插入新元素?如果需要,就选择序列容器;关联容器是不行的。
你是否关心容器中的元素师排序的?如果不关心,则哈希容器室一个可行的选择方案;否则,你要避免哈希容器。
容器中数据的布局是否需要和C兼容?如果需要兼容,就只能选择vector。
元素的查找速度是否是关键的考虑因素?如果是,就要考虑哈希容器、排序的vector和标准关联容器——或许这就是优先顺序。


确保容器中的对象拷贝正确而高效

调用empty而不是检查size()是否为 0
理由很简单:empty对所有的标准容器都是常数时间操作,而对一些list实现,size耗费线性时间。由于list所独有的链接操作。

区间成员函数优先于与之对应的单元素成员函数。

如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉。切勿创建包含auto_ptr的容器对象。问题的根源只是在于auto_ptr不是这样的智能指针。
永远都不要错误的认为:你可以通过创建auto_ptr的容器使指针被自动删除。

慎重选择删除元素的方法
erase是指向紧随被删除元素的下一个元素的有效迭代器。


要删除容器中有特定值得所有对象
  如果容器使vector、string或deque,则使用earse-remove习惯用法。
  如果容器是list,则使用list::remove
  如果容器是一个标准关联容器,则使用它的erase成员函数。

要删除容器中满足特定判别式(条件)的所有对象
  如果容器是vector、string或deque,则使用erase-remove_if的习惯用法。
  如果容器是list,则使用list::remove_if。
  如果容器使一个标准关联容器,则使用remove_copy_if和swap,或者写一个循环来遍历容器中的元素,记住当把迭代器传给erase时,要对它进行后缀递增。

要在循环内部做某些(除了删除对象之外的)操作
  如果容器使一个标准序列容器,则写一个循环来遍历容器中的元素,记住每次调用erase时,要用它的返回值更新迭代器。
  如果容器是一个标准关联容器,则写一个循环来遍历容器中的元素,记住当把迭代器传给erase时,要对迭代器作后缀递
增。

切勿对STL容器的线程安全性有不切实际的依赖。

  你不能指望STL库会把你从手工同步控制中解脱出来,而且你不能依赖于任何线程的支持。
  在容器所返回的每个迭代器的生存期结束前,都锁住容器
  对于作用于容器的每个算法,都锁住该容器,直到算法结束。  多个线程读是安全的
  多个线程对不同的容器作写入操作时安全的。
  对容器成员函数的每次调用,都锁住容器直到调用结束。

posted on 2014-04-04 21:10 Daywei 阅读(2097) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2014年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章档案

牛人博客

搜索

积分与排名

最新评论

阅读排行榜