内容提要
本文介绍了现代C++中的容器、智能指针和正则表达式。常用容器包括std::vector、std::list和std::deque,适用于不同场景。智能指针如std::shared_ptr和std::unique_ptr简化了内存管理,避免内存泄漏。正则表达式用于字符串匹配和处理,C++11引入了标准库支持,提升了开发效率。
延伸解读
容器选择:从场景出发
文章列举了多种容器,但选择的关键在于场景。std::vector适合随机访问,std::list适合频繁插入删除,std::deque适合头尾操作。std::array固定大小,比vector更节省内存,且不会自动扩容。无序容器如std::unordered_map基于哈希表,平均O(1)复杂度,但元素无序;有序容器基于红黑树,O(log n)但自动排序。理解这些差异有助于写出更高效的代码。
智能指针:所有权与循环引用
智能指针通过引用计数管理内存,但shared_ptr可能因循环引用导致内存泄漏。文章示例中两个对象互相持有shared_ptr,引用计数无法归零。weak_ptr不增加引用计数,可打破循环。unique_ptr独占所有权,只能通过std::move转移,转移后原指针为空。这些特性要求开发者明确所有权关系,避免悬空指针。
正则表达式:标准库支持与模式
C++11将正则表达式纳入标准库,不再依赖boost。文章介绍了普通字符、特殊字符、限定符等语法,以及std::regex_match和std::smatch的使用。正则表达式可用于检查、替换和提取子串。但需注意,正则表达式性能可能不如手写解析,且复杂模式可读性差。合理使用能提升字符串处理效率。
Q&A
现代C++中有哪些常用的容器?
常用的容器包括std::vector、std::list、std::deque、std::set、std::unordered_set、std::map、std::unordered_map、std::stack和std::queue。
智能指针在现代C++中有什么作用?
智能指针如std::shared_ptr和std::unique_ptr简化了内存管理,避免了内存泄漏。
C++11引入的正则表达式有什么用?
正则表达式用于字符串匹配和处理,能够检查子串、替换匹配的子串以及提取符合条件的子串。
std::vector和std::array有什么区别?
std::vector是动态数组,大小可变,而std::array是固定大小的数组,适合在大小已知的情况下使用。
如何使用std::shared_ptr管理内存?
使用std::make_shared创建对象并返回std::shared_ptr,引用计数为零时自动释放内存。
C++中的正则表达式是如何实现的?
C++11引入了正则表达式库,通过std::regex进行模式匹配,使用std::regex_match检查字符串。