一、引言
C++11 是 C++ 语言的一次革命性升级,它解决了旧版本在并发编程、内存管理和代码简洁性上的诸多痛点,引入了六大核心特性:STL 容器革新、智能指针、正则表达式、原子操作、Lambda 表达式,以及协程支持(需第三方库)。这些特性不仅提升了开发效率,还大幅优化了程序性能与安全性。
二、STL 容器
C++11 对 STL 容器的改进体现在性能优化与新类型引入:
无序容器(哈希表):
新增 unordered_map、unordered_set 等,基于哈希表实现,查询时间复杂度降至 O(1),适用于高频键值访问场景(如缓存系统)。对比传统 map(红黑树实现,O(log n)),性能提升显著。
unordered_map<string, int> word_count; // 哈希表存储词频
静态数组 array:替代原生数组,提供迭代器支持和越界检查,增强安全性。
单链表 forward_list:仅维护单向指针,内存占用比 list 减少 33%,适合插入删除频繁但无需回溯的场景。
性能对比表:
三、智能指针:告别内存泄漏
C++11 引入三种智能指针,基于 RAII(资源获取即初始化) 机制自动管理内存:
unique_ptr:
独占所有权,禁止拷贝(可通过 std::move 转移),适用于资源独占场景(如文件句柄)。
unique_ptr<FileHandler> handler = make_unique<FileHandler>("data.txt");
shared_ptr:
共享所有权,通过引用计数实现自动释放,需注意循环引用问题(结合 weak_ptr 解决)。
weak_ptr:
观察者模式,不增加引用计数,避免 shared_ptr 循环引用导致的内存泄漏。
内存管理对比:传统指针:手动 new/delete,易漏删或重复释放。
智能指针:自动生命周期管理,结合 make_shared 减少内存碎片。
四、正则表达式:字符串处理
C++11 标准库 <regex> 提供完整的正则支持,涵盖匹配、搜索、替换功能:
基本用法:
regex pattern(R"(\d+)"); // 匹配数字
smatch matches;
if (regex_search(text, matches, pattern)) {
cout << "Found: " << matches[0](@ref) << endl;
}
应用场景:
数据清洗(提取邮箱、电话号)、日志解析(匹配特定格式)。
性能提示:复杂正则表达式编译耗时,建议预编译并复用 regex 对象。
五、原子操作与多线程安全
C++11 通过 <atomic> 库支持无锁编程,确保多线程环境下的数据一致性:
原子类型:
atomic<int>、atomic_bool 等,保证操作的不可分割性,避免竞态条件。
atomic<int> counter(0);
counter.fetch_add(1, memory_order_relaxed); // 原子自增
内存序(Memory Order):
提供 memory_order_relaxed、memory_order_seq_cst 等选项,平衡性能与一致性需求。
案例:无锁队列、高性能计数器。
六、Lambda 表达式:函数式编程的利器
Lambda 允许内联定义匿名函数,简化回调、算法定制等场景:
语法结构:
auto add = [](int a, int b) -> int { return a + b; };
捕获列表:[=](值捕获)、[&](引用捕获),灵活控制变量作用域。
与 STL 结合:
vector<int> nums = {3,1,4,2};
sort(nums.begin(), nums.end(), [](int a, int b) { return a > b; }); // 降序排序
优势:替代函数对象(Functor),减少代码冗余,提升可读性。
七、协程:异步编程的新范式
尽管 C++20 正式引入协程,但 C++11 可通过第三方库(如 Boost.Coroutine)实现类似功能:
核心概念:协程允许函数挂起/恢复,简化异步 IO 和状态机逻辑。
应用场景:游戏逻辑(非阻塞动画)、网络服务器(高并发请求处理)。
代码示例(基于 Boost):
boost::coroutines::coroutine<void>::push_type task([](auto& yield) {
yield(); // 挂起协程
});