C++11对STL有哪些改进?
C++11对STL的改进主要集中在以下几个方面:
- 新的容器:
std::array
:是一个固定大小的容器,它将数组的性能和原生数组的语法优势结合起来,但又比原生数组更安全、更易用。std::forward_list
:表示单向链表,比std::list
更节省内存,因为它只存储指向下一个元素的指针。std::unordered_map
、std::unordered_set
、std::unordered_multimap
、std::unordered_multiset
:基于哈希表实现,提供了比传统的std::map
和std::set
更快的平均时间复杂度的查找、插入和删除操作。
- 智能指针:
std::unique_ptr
、std::shared_ptr
和std::weak_ptr
:这些智能指针为动态分配的内存提供了自动管理机制,大大简化了资源管理,并帮助防止内存泄漏。
- 类型推导:
auto
关键字:可以用于自动推导变量的类型,减少代码冗长,并使代码更易于维护。decltype
:根据表达式推断类型,常用于模板编程和复杂类型推导中。
- Lambda表达式:
- 提供了定义匿名函数的能力,让算法调用中的回调函数写法更加简洁。
- 线程支持库:
- 包含了线程、互斥锁、条件变量等,并发编程基础设施,为STL中的多线程编程提供了支持。
- 算法改进:
- 新增了一些算法,如
std::all_of
、std::any_of
、std::none_of
、std::copy_if
等,用于提供更多的范围操作。 - 改进了一些已有算法,如
std::sort
,使其能够更好地利用现代处理器的多核特性。
- 新增了一些算法,如
- 移动语义:
- 引入了移动构造函数和移动赋值操作符,允许容器和对象“移动”其内部状态而非复制,从而提高性能。
std::move
和std::forward
函数用于支持移动语义和完美转发。
- 初始化列表:
- 允许使用大括号
{}
直接初始化容器和对象,使代码更简洁,同时也支持自动类型推导。
- 允许使用大括号
- 元组(Tuples):
std::tuple
允许创建和操作一个固定大小的异构值集合。
- 范围基于的for循环:
- 新增加了基于范围的for循环,可以用来更简洁地遍历容器。
这些改进不仅提高了STL的性能和灵活性,也极大地提升了C++编程的便利性和表达力。