概念与区别
在 C++ 标准模板库(STL)中,unordered_map 和 unordered_set 是基于哈希表实现的关联容器。它们的核心优势在于摒弃了元素的有序性,从而换取了近乎常数时间的操作效率。
核心定义
- unordered_map:存储键值对(key-value pairs)。底层采用哈希表,每个键唯一,平均查找、插入和删除的时间复杂度为 O(1)。
- unordered_set:仅存储唯一元素,无键值对结构。同样基于哈希表,保证元素唯一性,查找效率极高。
与 map/set 的对比
虽然功能相似,但两者在实现机制上有显著差异:
- 底层结构:无序容器使用哈希表,有序容器(map/set)通常基于红黑树。
- 时间复杂度:无序容器平均 O(1),有序容器为 O(log N)。
- 元素顺序:无序容器不保证遍历顺序,有序容器保持升序排列。
- 迭代器类型:无序容器提供单向迭代器,有序容器支持双向迭代。
- 键的要求:无序容器需要键支持哈希和相等比较,有序容器需要键支持小于比较。
在实际开发中,若不需要维护顺序且追求极致性能,优先选择无序容器;若需区间查询或有序遍历,则保留有序容器。
构造方法
容器初始化方式灵活,支持多种场景。
unordered_map 构造
| 构造函数 | 说明 |
|---|---|
unordered_map() | 默认构造空容器 |
unordered_map(InputIterator first, InputIterator last) | 区间初始化 |
unordered_map(const unordered_map& um) | 拷贝构造 |
unordered_map(std::initializer_list<value_type> il) | 初始化列表 |
示例:初始化列表与区间构造
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int main() {
// 初始化列表
unordered_map<string, int> myMap = {{"apple", }, {, }};
vector<pair<string, >> vec = {{, }, {, }};
;
( & pair : myMap) {
cout << pair.first << << pair.second << endl;
}
;
}


