Effective STL:选择与使用的智慧

需积分: 3 2 下载量 182 浏览量 更新于2024-07-30 收藏 1.8MB PDF 举报
"Effective STL 2" 在Effective STL这本书中,作者通过一系列的条目向读者揭示了如何更高效、更正确地使用STL(Standard Template Library,标准模板库)。以下是对部分条目的详细解读: 1. **选择合适的容器**:不同的容器有不同的特性和效率,如vector适合动态数组,list适合频繁插入和删除,map则适用于键值对的查找。选择容器时应考虑算法需求和性能影响。 2. **避免容器独立代码的幻觉**:虽然STL提供了通用接口,但不同的容器实现方式不同,可能导致代码在特定容器上行为异常。编写代码时应考虑具体容器的特性。 3. **使容器内对象的复制廉价且正确**:确保对象的拷贝构造函数和赋值操作符有效且高效,以优化容器内的元素复制。 4. **使用empty()而不是size()==0**:当检查容器是否为空时,推荐使用empty()函数,因为其更直观且在某些情况下更高效。 5. **优先使用范围成员函数**:如`for_each()`,`accumulate()`等,它们通常比单元素操作更高效,因为可以避免多次迭代。 6. **警惕C++的最烦人解析**(Most Vexing Parse):C++有时会将初始化列表解释为函数声明,导致意外。确保使用括号明确表示构造函数调用。 7. **管理new创建的指针容器**:当容器包含new创建的指针时,记得在容器销毁前删除这些指针,防止内存泄漏。 8. **避免使用auto_ptr于容器中**:auto_ptr不适用于容器,因为它的所有权转移机制与容器要求的复制行为不兼容。推荐使用智能指针如unique_ptr或shared_ptr。 9. **谨慎选择删除选项**:删除容器元素时,考虑是否需要保持顺序,以及元素是否需要被析构。了解erase()和remove()的区别。 10. **理解allocator的约定和限制**:allocator影响内存分配方式,但并非所有STL容器都允许自定义allocator。理解其工作原理以优化内存管理。 11. **定制allocator的合理使用**:在特定场景下,如内存池分配,自定义allocator可以提高效率,但应谨慎使用,避免引入复杂性。 12. **对STL容器的线程安全有现实期望**:默认情况下,STL容器不是线程安全的。在多线程环境中,需要自己处理同步问题。 13. **优先使用vector和string**:相对于动态数组,它们提供更丰富的接口,自动管理内存,且在某些情况下效率更高。 14. **使用reserve()避免不必要的reallocate**:在预先知道容器大小的情况下,使用reserve()可以避免因元素增加导致的频繁内存重新分配。 15. **注意字符串实现的差异**:不同编译器可能有不同的string实现,了解这些差异以便写出跨平台的代码。 16. **将vector和string数据传递给遗留API**:考虑转换为原始指针或使用C风格字符串,以适应不支持STL的旧API。 17. **利用“swap技巧”修剪过剩容量**:通过交换元素较少的容器和当前容器,可以有效地释放vector或string的多余容量,提高效率。 这些条目提供了关于STL的深入见解,帮助开发者编写出更高效、更健壮的C++代码。理解并应用这些原则,能够显著提升STL在实际项目中的表现。