Effective STL:选择与使用容器的策略

3星 · 超过75%的资源 需积分: 29 3 下载量 96 浏览量 更新于2024-07-26 收藏 1.46MB PDF 举报
"Effective STL" 《Effective STL》是Scott Meyers所著的一本关于标准模板库(Standard Template Library,STL)的实践指南,书中详细介绍了如何更高效、更正确地使用STL容器、迭代器、算法和函数对象。以下是根据书中的部分内容提炼出的一些关键知识点: 1. 选择合适的容器:不同类型的容器有不同的特性和性能,如顺序容器(如vector、list、deque)和关联容器(如set、map)。理解它们的区别并根据实际需求选择能提供最佳性能的容器。 2. 避免容器独立代码的幻觉:虽然STL提供了一种看似与具体容器无关的抽象,但实际编写代码时,容器的选择会影响程序的效率和行为。因此,代码应考虑特定容器的特性。 3. 优化复制:对于容器内的对象,确保其复制操作既快速又正确,这可能涉及到使用浅拷贝或深拷贝,以及实现正确的赋值运算符和复制构造函数。 4. 使用`empty()`而不是检查`size()==0`:对于检查容器是否为空,直接调用`empty()`通常更高效,因为它避免了计算容器大小的开销。 5. 优先使用范围版本的成员函数:例如,使用`std::for_each(a.begin(), a.end(), func)`而不是`for`循环遍历,可以提高代码的简洁性和可读性,并利于使用算法。 6. 警惕C++的最令人困扰的解析(Most Vexing Parse):C++的语法可能导致意外的声明,尤其是在模板和类定义中,注意避免这种歧义。 7. 管理动态分配的指针:如果容器中存储的是指向动态分配对象的指针,确保在删除容器前释放这些指针,防止内存泄漏。 8. 避免使用容器的`auto_ptr`:`auto_ptr`不适用于容器,因为它的所有权转移可能导致意外的资源丢失。推荐使用`unique_ptr`或`shared_ptr`。 9. 慎重选择erase选项:不同的删除元素方法(如`erase`和`remove_if`)有不同的效果,理解它们的差异,选择合适的方式进行元素删除。 10. 了解allocator的约定和限制:allocator在STL中用于管理内存,它们有特定的行为和限制,自定义allocator时需遵循这些规则。 11. 明智使用自定义allocator:在特定场景下,如多线程环境或特定硬件限制下,自定义allocator可以提高性能或满足特定需求。 12. 对STL容器的线程安全性有现实期望:STL容器并不是线程安全的,这意味着在多线程环境下使用它们时,必须手动处理同步问题。 13. 优先使用`vector`和`string`:对于动态数组,`vector`和`string`提供了便利的接口和内存管理,优于直接使用`new`和`delete`操作。 14. 使用`reserve`避免不必要的重新分配:在预先知道容器大小的情况下,调用`reserve`可以避免因插入元素导致的频繁内存重新分配,提高性能。 15. 注意不同`string`实现的差异:不同编译器或库的`string`实现可能有细微差别,如默认字符类型、空字符串处理等,编写跨平台代码时要注意这些差异。 16. 向旧版API传递`vector`和`string`数据:在与不支持STL的旧API交互时,可能需要将`vector`或`string`转换为旧的C风格数组或指针。 17. 利用“swap技巧”减少额外容量:通过交换来删除容器的元素,而不是直接删除,可以保留容器的剩余容量,提高效率。 这些知识点构成了有效使用STL的基础,理解并应用它们可以提高C++程序的性能和质量。