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 站点

 

posted @ 2022-06-12 15:15  算是一个初学者  阅读(44)  评论(0编辑  收藏  举报