容器
1. 仔细选择你的容器
-
标准STL序列容器:vector、string、deque、list
-
标准STL关联容器:set、multiset、map、multimap
-
标准非STL容器:数组、bitset、valarry、stack、queue、prioricy_queue
小心对“容器无关代码”的幻想
使容器里对象的拷贝操作轻量而正确
-
使用容器会带来大量的拷贝工作。一个使拷贝更高效、正确且对分割问题(把一个派生类对象插入基类的容器几乎总是错的)免疫的简单方式是建立指针的容器而不是对象的容器(指针的拷贝总是很快的)
使用empty来替代检查size()是否为0
-
对所有的标准容器,empty是一个常数时间的操作,但对于一些list实现,size花费线性时间
-
尽量使用区间成员函数替代他们的单元素兄弟
-
警惕c++最令人恼怒的解析
-
当使用new得指针得容器时,记得在销毁容器前delete那些指针
-
永不建立auto_ptr得容器
-
再删除选项中仔细选择
-
注意分配器得协定和约束
-
理解自定义分配器的正确用法
-
对STL容器线程安全性的期待现实一些
-
多个读取者是安全的,多线程可以同时读取一个容器的内容,这将正确地执行。当然在读取时不能有任何写入者操作这个容器。
-
对不同的容器的多个写入者。多线程可以同时写不同的容器
vector和string
-
尽量使用vector和string来替代动态分配的数组
-
使用reverse来避免不必要的重新分配
-
如果想知道一个vector或者string中有多少没有被占用的内存,必须从capacity()中减去size().
-
小心string实现的多样性
-
如何将vector和string的数据传给遗留的API
-
使用交换技巧来修整过剩容量
-
vector<Contestant>(contestants).swap(contestansts)
-
string(s).swap(s)
-
避免使用vector<bool>
关联容器
19.了解相等和等价的区别
-
为指针的关联容器指定比较类型
-
永远让比较函数对相等的值返回false
-
避免原地修改set和multiset的键
-
考虑用有序vector代替关联容器
-
在有序容器中存储数据很有可能比在标准关联容器中保存相同的数据消耗更少的内存
-
当页面错误值得重视的时候,在有序的vector中通过二分查找可能比在一个标准关联容器中查找更快
-
当关乎效率时在map::operator[]和map-insert之间仔细选择
-
熟悉非标准散列容器
迭代器
-
尽量使用iterator替代const_iterator,reverse_iterator和const_reverse_iterator
-
用distance和advance把const_iterator转化成iterator
-
了解如何通过reverse_iterator的base得到iterator
-
需要一个一个字符输入时考虑使用istreambuf_iterator
算法
-
确保目标区间足够大
-
了解你的排序选择
-
如果你真的想要删除东西就在类似remove的算法后街上erase
-
提防在指针的容器上使用类似remove的算法
-
注意哪个算法需要有序区间
-
通过mismatch或lexicographical比较实现简单的忽略大小写字符串比较
-
了解copy_if的正确实现
-
用accumulate或for_each来统计区间
仿函数、仿函数类、函数类
-
把仿函数类设计为用于值传递
-
用纯函数做判断式
-
使仿函数类可适配
-
了解使用ptr_fun、mem_fun和mem_fun_ref的原因
-
确定less<T>表示operator<
使用STL编程
-
尽量用算法调用替代手写循环
-
尽量用成员函数替代同名的算法
-
注意count、find、binary_search、lower_bound、upper_bound和equal_range的区别
-
考虑使用函数对象替代函数作算法的参数
-
避免产生只写代码
-
总是#include适当的头文件
-
学习破解有关STL的编译器诊断信息
-
让你自己熟悉有关STL的网站