C++中set与unordered_set对比指南
C 中 set 和 unordered_set 使用指南一、核心概念set特点基于红黑树实现元素自动排序默认升序操作时间复杂度$O(\log n)$需要头文件#include setunordered_set特点基于哈希表实现元素无序存储平均时间复杂度$O(1)$最坏情况 $O(n)$需要头文件#include unordered_set二、基本操作对比操作setunordered_set插入元素.insert(value).insert(value)删除元素.erase(value).erase(value)查找元素.find(value).find(value)检查存在性.count(value) 0.count(value) 0元素数量.size().size()三、代码示例#include iostream #include set #include unordered_set int main() { // 1. set 使用示例自动排序 std::setint orderedSet; orderedSet.insert({3, 1, 4, 2}); // 插入元素 std::cout Set 内容已排序: ; for (int num : orderedSet) std::cout num ; // 输出: 1 2 3 4 // 2. unordered_set 使用示例无序存储 std::unordered_setint unorderedSet; unorderedSet.insert({3, 1, 4, 2}); std::cout \nUnordered_set 内容: ; for (int num : unorderedSet) std::cout num ; // 输出可能: 2 4 1 3顺序不确定 // 3. 查找操作对比 std::cout \n\n查找结果: ; std::cout Set 查找4: (orderedSet.find(4) ! orderedSet.end()); std::cout | Unordered_set 查找4: (unorderedSet.find(4) ! unorderedSet.end()); // 4. 删除操作 orderedSet.erase(2); unorderedSet.erase(2); return 0; }四、选择建议优先使用unordered_set当需要极速查找$O(1)$ 平均复杂度元素顺序无关紧要自定义哈希函数对自定义类型选择set当需要有序遍历元素需要范围查询如lower_bound()元素比较操作简单对自定义类型需重载五、进阶技巧自定义排序规则setstruct CustomCompare { bool operator()(const int a, const int b) const { return a b; // 改为降序 } }; std::setint, CustomCompare customSet;自定义哈希函数unordered_setstruct MyHash { size_t operator()(const std::string s) const { return s.length(); // 按字符串长度哈希 } }; std::unordered_setstd::string, MyHash customUnorderedSet;关键提示unordered_set的性能取决于哈希函数质量劣质哈希可能导致 $O(n)$ 复杂度。当元素数量超过桶数量时会自动重新哈希rehash可通过.load_factor()监控负载因子。