C++11中引入了哪些新的容器?请描述它们的特点和用法。
参考回答
C++11 引入了几个新的容器,这些容器增强了标准库的功能和灵活性。主要有两个新的容器:std::array
和 std::unordered_map
,这两个容器分别解决了不同的问题,并且具有不同的特点和使用方式。
1. std::array
std::array
是 C++11 引入的一个容器类,它是一个固定大小的数组封装。它结合了传统数组和容器的特点,提供了数组的固定大小特性,同时也具有容器类的接口,支持更多的 STL 算法。
特点:
- 固定大小:
std::array
的大小在编译时确定,并且不可修改。 - 与原生数组兼容:与原生数组一样,
std::array
也存储数据在连续的内存块中。 - 支持 STL 容器接口:
std::array
支持常见的容器接口,比如begin()
,end()
,size()
,at()
,front()
,back()
等。
用法:
2. std::unordered_map
std::unordered_map
是 C++11 引入的一个容器,它类似于 std::map
,但是它使用哈希表来存储数据,因此提供了更快的平均查找时间复杂度(O(1)),而 std::map
使用红黑树,查找时间复杂度为 O(log n)。
特点:
- 无序存储:与
std::map
不同,std::unordered_map
存储元素时没有顺序,它的键值对是无序的。 - 基于哈希表:元素通过哈希函数存储在哈希表中,提供了常数时间的查找、插入和删除操作。
- 性能优势:在大多数情况下,
std::unordered_map
提供比std::map
更快的查找性能,特别是对于较大的数据集。
用法:
详细讲解与拓展
std::array
的扩展:std::array
是一个轻量级的容器,适合在已知大小的情况下使用,它提供了数组的所有特性,但增加了 STL 容器的一些优点。比如它支持std::sort()
等 STL 算法,且通过.at()
可以进行边界检查。- 在实际开发中,如果你需要一个固定大小的数组且不想失去 STL 容器的灵活性,
std::array
是一个理想的选择。
std::unordered_map
的扩展:std::unordered_map
通过哈希表存储数据,其查找、插入和删除的平均时间复杂度为 O(1),但最坏情况下时间复杂度为 O(n)。因此,它非常适合频繁查找的场景,比如缓存系统。- 与
std::map
的区别在于,std::unordered_map
的键值对没有顺序,适用于不关心顺序,只关心键查找速度的场景。 std::unordered_map
使用哈希函数来决定元素的位置,默认情况下使用std::hash
,但也可以为自定义类型提供特定的哈希函数。
总结
C++11 引入了两个新的容器:std::array
和 std::unordered_map
。std::array
提供了固定大小的数组功能,同时支持 STL 容器接口,适合在数组大小已知且需要 STL 容器功能的场景下使用。std::unordered_map
提供了一个基于哈希表的键值对存储容器,具有常数时间的查找性能,适合高效查找的场景,尤其是在元素数量较大的情况下。通过这两个容器,C++11 大大增强了标准库的灵活性和性能。