c++ std::unordered_set、std::unordered_map、std::unordered_multiset、std::unordered_multimap使用笔记
std::unordered_set、std::unordered_map、std::unordered_multiset 和 std::unordered_multimap 是 C++ 标准库中的无序关联容器,基于哈希表实现。它们提供了快速的查找、插入和删除操作。
1. std::unordered_set
- 定义: 存储唯一元素的集合,元素无序。
- 使用场景: 需要快速查找元素是否存在,且不关心元素的顺序。
- 简单使用:
#include <unordered_set> #include <iostream> int main() { std::unordered_set<int> uset = {1, 2, 3, 4, 5}; // 插入元素 uset.insert(6); // 查找元素 if (uset.find(3) != uset.end()) { std::cout << "3 found in set" << std::endl; } // 删除元素 uset.erase(2); // 遍历 for (const auto& elem : uset) { std::cout << elem << " "; } return 0; }
2. std::unordered_map
- 定义: 存储键值对的集合,键唯一,元素无序。
- 使用场景: 需要快速通过键查找对应的值,且不关心键值对的顺序。
- 简单使用:
#include <unordered_map> #include <iostream> int main() { std::unordered_map<std::string, int> umap = {{"apple", 1}, {"banana", 2}}; // 插入键值对 umap["cherry"] = 3; // 查找键 if (umap.find("banana") != umap.end()) { std::cout << "banana found, value: " << umap["banana"] << std::endl; } // 删除键值对 umap.erase("apple"); // 遍历 for (const auto& pair : umap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; }
3. std::unordered_multiset
- 定义: 存储元素的集合,元素可以重复,元素无序。
- 使用场景: 需要快速查找元素是否存在,且允许重复元素。
- 简单使用:
#include <unordered_set> #include <iostream> int main() { std::unordered_multiset<int> umset = {1, 2, 2, 3, 4, 4, 4}; // 插入元素 umset.insert(5); // 查找元素 if (umset.find(2) != umset.end()) { std::cout << "2 found in multiset" << std::endl; } // 删除元素 umset.erase(4); // 遍历 for (const auto& elem : umset) { std::cout << elem << " "; } return 0; }
4. std::unordered_multimap
- 定义: 存储键值对的集合,键可以重复,元素无序。
- 使用场景: 需要快速通过键查找对应的值,且允许键重复。
- 简单使用:
#include <unordered_map> #include <iostream> int main() { std::unordered_multimap<std::string, int> ummap = {{"apple", 1}, {"banana", 2}, {"apple", 3}}; // 插入键值对 ummap.insert({"cherry", 4}); // 查找键 auto range = ummap.equal_range("apple"); for (auto it = range.first; it != range.second; ++it) { std::cout << "apple: " << it->second << std::endl; } // 删除键值对 ummap.erase("banana"); // 遍历 for (const auto& pair : ummap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; }
优缺点
- 优点:
- 快速查找、插入和删除: 平均时间复杂度为 O(1)。
- 灵活性: 支持自定义哈希函数和键比较函数。
- 缺点:
- 无序: 元素存储顺序不确定。
- 内存开销: 哈希表需要额外的内存来维护哈希桶。
- 哈希冲突: 哈希函数设计不当可能导致性能下降。
使用场景
std::unordered_set: 需要快速检查元素是否存在,且不关心顺序。std::unordered_map: 需要快速通过键查找值,且不关心顺序。std::unordered_multiset: 需要快速检查元素是否存在,且允许重复元素。std::unordered_multimap: 需要快速通过键查找值,且允许键重复。
这些容器在需要高效查找、插入和删除操作的场景中非常有用,尤其是在元素顺序不重要的情况下。
985

被折叠的 条评论
为什么被折叠?



