【C++算法打怪专栏】C++ `unordered_set` 常用初始化与插入方法总结

【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() 的括号!

  • ❌ 错误:

    cpp 复制代码
    unordered_set<int> mp(nums.begin(), nums.end);

    (传成了函数指针,会直接编译报错)

  • ✔️ 正确:

    cpp 复制代码
    unordered_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);
}
  1. 初始化列表(适用于已知少量固定初始值)
    如果不是从数组导入,而是硬编码一些初始测试数据,可以直接使用大括号:
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 漏掉括号)往往会引发一堆让人头疼的编译报错!
相关推荐
超级架构师9 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
深圳市快瞳科技有限公司9 小时前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
时间的拾荒人10 小时前
CMake 常用命令详解:从版本声明到安装部署
c++·面试
叼烟扛炮10 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
LMT流氓兔11 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
专注仿真11 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
小豆庄11 小时前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
外收内放11 小时前
Python基础语法练习题(75)
开发语言·python·学习
Tisfy11 小时前
LeetCode 3882.网格图中最小异或路径:动态规划
算法·leetcode·动态规划
starzy199012 小时前
Scala循环与判断:一切皆表达式的控制流
开发语言·人工智能·scala