Effective STL英文版:C++容器与内存管理指南

需积分: 10 2 下载量 20 浏览量 更新于2024-11-14 收藏 1.82MB PDF 举报
《Effective STL》是由Scott Meyers编写的经典著作,专为C++程序员设计,旨在帮助读者深入理解和高效利用标准模板库(STL)。本书在C++编程社区中极为珍贵,因为它是学习STL的最佳参考资料之一,尽管其英文版本相对难以寻觅。 章节内容涵盖了STL容器选择、设计原则以及常见陷阱的指导。以下是一些关键知识点: 1. **容器选择**:作者强调了在使用STL容器(如vector, list, set等)时需谨慎考虑,不同的场景适合不同的容器。选择合适的容器能够提高代码效率和性能。 2. **独立代码的幻觉**:警告开发者避免编写看似容器无关,但实际上可能导致性能问题的代码,要确保代码针对特定容器特性进行了优化。 3. **对象复制**:对于容器中的对象,如何实现廉价且正确的复制至关重要,这涉及到深拷贝和浅拷贝的区别以及STL容器如何处理这些操作。 4. **empty()函数的使用**:提倡使用`empty()`函数代替检查容器大小是否为零,以简化错误检查并提高可读性。 5. **范围成员函数**:推荐使用范围版本的成员函数,它们通常更简洁且功能强大,特别是在处理迭代器时。 6. **C++的困扰解析**:介绍C++语言的一些复杂特性,如模板元编程,可能带来的迷惑,提醒读者注意这些潜在陷阱。 7. **内存管理**:当使用动态存储的新指针作为容器元素时,务必在容器销毁前正确释放内存,以避免内存泄漏。 8. **auto_ptr的替代**:建议避免直接使用`auto_ptr`,因为它在C++11后已被`unique_ptr`取代,后者提供了更好的内存管理和语义。 9. **删除选项**:讨论不同容器元素删除策略的优劣,选择最符合需求的方法以提升性能和代码清晰度。 10. **理解自定义分配器**:讲解STL容器如何与自定义分配器协作,以及何时选择使用它们以适应特殊内存管理需求。 11. **线程安全的期望**:关于STL容器的线程安全性,提供实际的使用建议,以防止并发编程中的问题。 12. **vector和string**:这两个容器是STL中的核心,提倡优先使用它们而非动态数组,同时介绍了如何通过`reserve`来避免不必要的内存重新分配。 13. **动态数组的替代**:推荐使用`vector`和`string`,因为它们提供了更好的内存管理、扩展性和易用性。 14. **避免不必要的reallocations**:强调节省内存资源的重要性,通过`reserve`预分配空间来减少内存操作。 15. **字符串变体理解**:讨论字符串的不同实现及其适用场景,包括字符数组、C风格字符串和C++标准库中的`string`。 《Effective STL》深入浅出地阐述了STL的精髓,是每个C++程序员提升编程技能和效率不可多得的参考书。通过掌握这些知识点,开发者可以编写出更高效、可维护的C++代码。
2008-01-01 上传
不知道网上有没有Effective STL(中文),我找不到,我自己整理出了这个《Effective STL(中文)》共享给需要的人。

《Effective STL》目录:

前言
致谢
导读
容器
条款1:仔细选择你的容器
条款2:小心对“容器无关代码”的幻想
条款3:使容器里对象的拷贝操作轻量而正确
条款4:用empty来代替检查size()是否为0
条款5:尽量使用区间成员函数代替它们的单元素兄弟
条款6:警惕C++最令人恼怒的解析
条款7:当使用new得指针的容器时,记得在销毁容器前delete那些指针
条款8:永不建立auto_ptr的容器
条款9:在删除选项中仔细选择
条款10:注意分配器的协定和约束
条款11:理解自定义分配器的正确用法
条款12:对STL容器线程安全性的期待现实一些
vector和string
条款13:尽量使用vector和string来代替动态分配的数组
条款14:使用reserve来避免不必要的重新分配
条款15:小心string实现的多样性
条款16:如何将vector和string的数据传给传统的API
条款17:使用“交换技巧”来修整过剩容量
条款18:避免使用vector<bool>
关联容器
条款19:了解相等和等价的区别
条款20:为指针的关联容器指定比较类型
条款21:永远让比较函数对相等的值返回false
条款22:避免原地修改set和multiset的键
条款23:考虑使用有序vector代替关联容器
条款24:当关乎效率时应该在map::operator[]和map-insert之间仔细选择
条款25:熟悉非标准散列容器
迭代器
条款26:尽量用iterator代替const_iterator,reverse_iterator和const_reverse_iterator
条款27:用distance和advance把const_iterator转化成iterator
条款28:了解如何通过reverse_iterator的base得到iterator
条款29:需要一个一个字符输入时考虑使用istreambuf_iterator
算法
条款30:确保目标区间足够大
条款31:了解你的排序选择
条款32:如果你真的想删除东西的话就在类似remove的算法后接上erase
条款33:提防在指针的容器上使用类似remove的算法
条款34:注意哪个算法需要有序区间
条款35:通过mismatch或lexicographical比较实现简单的忽略大小写字符串比较
条款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:考虑使用函数对象代替函数作算法的参数
条款47:避免产生只写代码
条款48:总是#include适当的头文件
条款49:学习破解有关STL的编译器诊断信息
条款50:让你自己熟悉有关STL的网站
参考书目
附录A:区域设置和忽略大小写的字符串比较
附录B:在微软STL平台上的注意事项
词汇表
索引
关于本电子书