Effective STL
记录看 《Effective STL》 进程
==========================
一. 容器
1. 慎重选择容器类型
2. 不要试图编写独立于容器类型的代码
3. 确保容器中的对象拷贝正确而高效
4. 调用 empty 而不是检查 size() 是否为0
5. 区间成员函数优先于与之对应的单元素成员函数
6. 当心编译器最烦人的分析机制
7. 如果容器中包含了通过new操作符创建的指针, 切记在容器对象析构前将指针delete掉
8. 切勿创建包含 auto_ptr 的容器对象
9. 慎重选择删除元素的方法
10. 了解分配子 (allocator) 的约定和限制
11. 理解自定义分配子的合理用法
12. 切勿对 STL 容器的线程安全性有不切实际的依赖
二. Vector 和 string
13. vector 和 string 优先于动态分配的数组
14. 使用 reserve 来避免不必要的重新分配
15. 注意 string 实现的多样性
16. 了解如何把 vector 和 string 数据传给久的 API
17. 使用 “swap” 技巧除去多余的容量
18. 避免使用 vector<bool>
三. 关联容器
19. 理解相等 (equality) 和 (equivalance) 的区别
20. 为包含指针的关联容器指定比较类型
21. 总是让比较函数在等值情况下返回 false
22. 切勿直接修改 set 或 multiset 中的键
23. 考虑用排序的 vector 替代关联容器
24. 当效率至关重要时, 请在 map::operator[] 与 map::insert 之间谨慎作出选择
25. 熟悉非标准的散列容器
四. 迭代器
26. iterator 优先于 const_iterator, reverse_iterator 及 const_reserve_iterator
27. 使用 distance 和 advance 将容器的 const_iterator 转换为 iterator
28. 正确理解由 reserve_iterator 的 base() 成员函数所产生的 iterator 的用法
29. 对于逐个字符的输入请考虑 istreambuf_iterator
五. 算法
30. 确保目标区间足够大
31. 了解各种与排序有关的选择
32. 如果确实有需要删除元素, 则需要在 remove 这一类算法之后调用 erase
33. 对包含指针的容器使用 remove 这一类算法时要特别小心
34. 了解哪些算法要求使用排序的区间作为参数
35. 通过 mismatch 和 lexicographical_compare 实现简单的忽略大小写的字符串比较
36. 理解 copy_if 算法的正确实现
37. 使用 accumulate 或者 for_each 进行区间统计
六. 函数子, 函数子类,函数及其他
38. 遵循按值传递的原则来设计函数子类
39. 确保判别式是 “纯函数”
40. 若一个类是函数子, 则应使它可配接
41. 理解 ptr_fun,mem_fun 和 mem_fun_ref 的来由
42. 确保 less<T> 与 operator< 具有相同的语义
七. 在程序中使用 STL
43. 算法调用优先于手写的循环
44. 容器的成员函数优先于同名的算法
45. 争取区分 count/find/binary_search/lower_bound/upper_bound 和 equal_range
46. 考虑使用函数对象而不是函数作为 STL 算法的参数
47. 避免产生 “直写型 (write-only)” 的代码
48. 总是包含 (#include ) 正确的头文件
49. 学会分析与 STL 相关的编译器诊断信息
50. 熟悉与 STL 相关的 web 站点