目录
一、unordered容器
在C++98标准中,STL提供的关联式容器如std::map
和std::set
确实使用红黑树作为其底层的数据结构。红黑树是一种自平衡二叉查找树,它保证了树的高度始终是O(logn)O(logn),因此在最坏的情况下,查找、插入和删除操作的时间复杂度也是O(logn)O(logn)。尽管这样的性能对于大多数应用来说已经足够好,但在某些需要大量查找操作的场景下,尤其是当容器非常大时,这种对数级别的性能可能仍显不足。
为了解决这个问题,C++11标准引入了unordered
系列的容器,它们使用哈希表作为底层实现。哈希表通过哈希函数将键映射到特定的索引上,从而使得查找、插入和删除操作可以在平均情况下以接近常数时间复杂度O(1)完成。以下是这四个容器的简要介绍:
- std::unordered_set: 存储唯一键值的集合,不允许有重复的键值。
- std::unordered_multiset: 存储键值的集合,允许存在重复的键值。
- std::unordered_map: 存储键值对,键必须是唯一的,每个键对应一个值。
- std::unordered_multimap: 存储键值对,键可以不是唯一的,允许存在相同键对应多个值的情况。
需要注意的是
- 尽管
unordered
容器提供了更快的平均查找速度,但它们的性能依赖于哈希函数的质量以及容器的负载因子(即元素数量与桶的数量的比例)。 - 如果哈希函数分布不均匀或者负载因子过高,则可能导致性能下降。
- 此外,
unordered
容器不会维持元素的任何顺序,这与基于红黑树的容器能够自然地按键值排序形成对比。
总之,unordered
容器非常适合需要高效查找并且不关心元素顺序的场景。如果你的应用程序需要频繁的查找操作,并且可以接受元素无序存放的话,那么unordered
容器是一个非常好的选择。
二 unordered_map
1、文档说明
- unordered_map是存储<key, value>键值对的关联式容器,其允许通过key快速的索引到与其对应的value。
- 在unordered_map中,键值通常用于唯一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。
- 在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内 找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
- 与map相比,unordered_map在通过key访问单个元素时更快,但在遍历元素子集的范围迭代方面效率较低。
- unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问 value。
- 它的迭代器至少是前向迭代器。
2、接口说明
1. 构造
函数声明 |
功能介绍 |
构造不同格式的unordered_map对象 |
- 默认构造函数:创建一个空的unordered_map对象。
std::unordered_map<int, std::string> map1;
- 构造一个unordered_map对象,其中包含范围[first,last]中的每个元素的副本。
std::vector<std::pair<int, std::string>> vec = { {1, "one"}, {2, "two"}, {3, "three"}}; std::unordered_map<int, std::string> map2(vec.begin(), vec.end());
- 复制构造函数(并使用分配器复制)对象初始化为具有与ump unordered_map对象相同的内容和属性。
std::unordered_map<int, std::string> map3(map2);
- 移动构造函数(与分配器一起移动)对象获取右值ump的内容。
std::unordered_map<int, std::string> map4(std::move(map3));
- initializer list用列表的内容初始化容器。
std::unordered_map<int, std::string> map5 = { {1, "one"}, {2, "two"}, {3, "three"}};
2. 容量
函数声明 |
功能介绍 |
bool empty() const |
检测unordered_map是否为空 |
size_t size() const |
获取unordered_map的有效元素个数 |
3. 迭代器
函数声明 |
功能介绍 |