【C++算法打怪专栏】C++ unordered_set 常用初始化与插入方法总结
在刷题(如 LeetCode 128. 最长连续序列)时,我们经常需要用到哈希集合 unordered_set 来进行快速查找和去重。今天复盘时发现自己对如何将 vector 元素放入 unordered_set 有点模糊,甚至漏掉了 end() 的括号导致编译报错。
下面把 unordered_set 常用的初始化与插入方式做个系统整理,方便后续复盘查阅!
一、 unordered_set 的三种主流赋值/放入方式
1. 迭代器范围构造(最推荐、代码最简短)
利用 vector 的迭代器区间直接初始化。这也是刷题中最常用、最高效的写法:
cpp
#include <vector>
#include <unordered_set>
using namespace std;
vector<int> nums = {100, 4, 200, 1, 3, 2};
// 通过迭代器范围直接构造哈希集合
unordered_set<int> mp(nums.begin(), nums.end());
⚠️ 避坑小贴士:
初始化时千万别漏掉
end()的括号!
❌ 错误:
cppunordered_set<int> mp(nums.begin(), nums.end);(传成了函数指针,会直接编译报错)
✔️ 正确:
cppunordered_set<int> mp(nums.begin(), nums.end());(调用函数获取迭代器)
2. 先创建空集合,再用 insert() 逐个插入
如果需要先声明一个空集合,后续再把元素塞进去,可以使用成员函数 insert():
cpp
vector<int> nums = {1, 2, 3, 4, 5};
unordered_set<int> mp;
// 方式 A:常规 for 循环
for (int i = 0; i < nums.size(); i++) {
mp.insert(nums[i]);
}
// 方式 B:范围 for 循环(C++11 更加简洁)
for (int num : nums) {
mp.insert(num);
}
- 初始化列表(适用于已知少量固定初始值)
如果不是从数组导入,而是硬编码一些初始测试数据,可以直接使用大括号:
cpp
unordered_set<int> mp = {1, 2, 3, 4, 5};
二、 核心操作与效率对比
| 操作方式 | 代码形式 | 时间复杂度 | 适用场景 |
|---|---|---|---|
| 迭代器区间构造 | unordered_set<int> mp(vec.begin(), vec.end()); |
O(N)O(N)O(N) | 从现有 vector 或数组批量导入元素(最常用) |
insert() 插入 |
mp.insert(val); |
平均 O(1)O(1)O(1) | 动态向集合中添加元素 |
| 列表初始化 | unordered_set<int> mp = {1, 2, 3}; |
O(N)O(N)O(N) | 代码测试、固定初始数据 |
三、 总结与反思
- 容器构造一步到位: 以后刷题遇到需要将数组转哈希表的情况,直接用
unordered_set<int> mp(nums.begin(), nums.end());,既优雅又高效。 - 细节决定成败: 函数调用千万不要漏掉小括号
(),一个小小的笔误(如nums.end漏掉括号)往往会引发一堆让人头疼的编译报错!