Effective STL:选择与使用的智慧

4星 · 超过85%的资源 需积分: 29 105 下载量 56 浏览量 更新于2024-11-28 收藏 1.46MB PDF 举报
"Effective STL.pdf" 《Effective STL》是一本由Scott Meyers撰写的关于标准模板库(STL)使用的经典书籍。这本书提供了一系列实践性的编程准则,旨在帮助程序员更高效、更正确地使用STL容器、算法和迭代器。以下是对其中一些关键知识点的详细解释: 1. 选择合适的容器:不同的STL容器(如vector、list、set、map等)有不同的性能特征,应根据需求选择最合适的。例如,vector适合随机访问,而list适合频繁的插入和删除。 2. 避免对容器独立代码的误解:编写与容器类型无关的代码看似理想,但往往难以实现,因为不同容器的操作和性能特性差异显著。 3. 优化对象复制:容器中的对象经常被复制,确保复制操作既快速又正确至关重要,例如,通过使用浅拷贝或深拷贝来处理复杂对象。 4. 使用empty而非size()检查零:容器为空时,调用empty()比检查size()是否为零更高效且清晰。 5. 优先使用范围成员函数:如`for_each`和`transform`,它们通常比单元素版本更简洁且更高效。 6. 警惕C++的最烦人解析(Most Vexing Parse):在声明函数对象或使用模板时,要小心避免C++语法陷阱,可能导致意外的构造函数调用。 7. 管理动态分配的指针容器:当容器存储new创建的指针时,记得在容器销毁前释放这些指针,防止内存泄漏。 8. 不要在容器中使用auto_ptr:auto_ptr不适用于容器,因为它不支持共享所有权,应使用智能指针如unique_ptr或shared_ptr。 9. 慎重选择erase选项:不同的erase方法可能会影响容器的迭代器和引用,比如erase返回的新迭代器位置,以及可能触发的重新分配。 10. 了解allocator的约定和限制:allocator在STL中负责内存分配,但其行为并非完全一致,了解其工作方式可以避免意外。 11. 自定义allocator的合理使用:在特定情况下,自定义allocator可以优化内存管理,但大多数情况下标准allocator已经足够。 12. 对STL容器的线程安全有现实期望:STL容器并非线程安全,需要在多线程环境中自行管理同步。 13. 优先使用vector和string:相对于动态数组,vector和string提供了更多便利的功能,如自动扩展和异常安全。 14. 使用reserve避免不必要的重新分配:在预先知道大小的情况下,调用reserve可以减少vector或string的内存重新分配次数。 15. 注意string实现的差异:不同编译器的string实现可能存在细微差别,这可能影响性能或行为。 16. 将vector和string数据传递给遗留API:与遗留API交互时,可能需要将STL容器转换为旧式C风格的数组或指针。 17. 使用“交换技巧”修剪多余容量:当不再需要额外容量时,可以使用swap函数将容器与一个空容器交换,以释放内存。 这些指导原则是STL高效编程的基础,理解和遵循这些规则,可以提升代码质量并减少潜在问题。