【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 漏掉括号)往往会引发一堆让人头疼的编译报错!
相关推荐
众链网络2 小时前
Agent 的成本大头不在“写“,在“判断“:拆解专用决策模型的三层架构
java·开发语言·人工智能·微服务
周小董2 小时前
[1371]jdk管理工具
java·开发语言
Terra.K2 小时前
高精度阶乘求和模板深度解析
开发语言·c++·算法
Hum8le2 小时前
漏洞知识点《php伪协议》
开发语言·安全·web安全·php
青春逝如流水2 小时前
Java 中线程的创建方式:从基础到现代
java·开发语言·多线程·ai文章
智码看视界2 小时前
C++智能指针全景剖析及面试20问
开发语言·c++·深度学习·面试·内存管理·智能指针
铅笔小新z2 小时前
【C语言】深入理解指针
c语言·开发语言
Peregrine93 小时前
C++ - > 类和对象
java·c++·算法
余醉 | dtminer3 小时前
56%的保护效应藏在乳腺密度里:Nat Commun 高分中介孟德尔随机化全 R 管线拆解(附核心图)
开发语言·r语言·孟德尔随机化