当前位置: 首页 > news >正文

C++ STL 中的 `unordered_map` 和 `unordered_set` 总结

1. unordered_map

unordered_map 是一个基于哈希表实现的容器,存储键值对(key-value),每个键必须唯一,可以快速插入、删除、查找。

基本特性

  • 存储结构:键值对 (key-value)。
  • 键唯一性:每个键在表中必须是唯一的。
  • 无序存储:键值对的存储顺序与插入顺序无关。
  • 时间复杂度
    • 平均情况下,插入、删除、查找的时间复杂度为 ( O(1) )。
    • 最坏情况下(哈希冲突严重时),时间复杂度为 ( O(n) )。

常用函数

函数功能说明
insert({key, val})插入键值对,若键已存在,则插入失败。
erase(key)删除键为 key 的元素,若不存在则不执行操作。
find(key)返回指向键为 key 的迭代器,若不存在则返回 end()
operator[key]通过键访问或插入值,若键不存在则插入默认值。
size()返回哈希表中元素的数量。
empty()判断哈希表是否为空。
clear()清空哈希表中的所有元素。

示例代码

#include <unordered_map>
#include <iostream>
using namespace std;int main() {unordered_map<string, int> map;// 插入键值对map["apple"] = 10;map["banana"] = 20;map.insert({"cherry", 30});// 查找元素if (map.find("banana") != map.end()) {cout << "banana: " << map["banana"] << endl;}// 删除元素map.erase("apple");// 遍历哈希表for (auto& [key, value] : map) {cout << key << ": " << value << endl;}return 0;
}

2. unordered_set

unordered_set 是一个基于哈希表实现的容器,用于存储唯一元素(类似于数学中的集合),不存储值。

基本特性

  • 存储结构:仅存储唯一的键(没有值)。
  • 键唯一性:集合中的每个键必须唯一。
  • 无序存储:元素存储的顺序与插入顺序无关。
  • 时间复杂度
    • 平均情况下,插入、删除、查找的时间复杂度为 ( O(1) )。
    • 最坏情况下,时间复杂度为 ( O(n) )。

常用函数

函数功能说明
insert(key)插入元素 key,若元素已存在,则插入失败。
erase(key)删除元素 key,若不存在,则不执行操作。
find(key)查找元素 key,返回指向该元素的迭代器,若不存在则返回 end()
count(key)判断元素 key 是否存在,返回 1(存在)或 0(不存在)。
size()返回集合中元素的数量。
empty()判断集合是否为空。
clear()清空集合中的所有元素。

示例代码

#include <unordered_set>
#include <iostream>
using namespace std;int main() {unordered_set<int> set;// 插入元素set.insert(10);set.insert(20);set.insert(30);set.insert(10); // 插入失败,10 已存在// 查找元素if (set.find(20) != set.end()) {cout << "20 exists in the set!" << endl;}// 删除元素set.erase(20);// 遍历集合for (auto& elem : set) {cout << elem << " ";}return 0;
}

3. unordered_mapunordered_set 对比

特性unordered_mapunordered_set
存储内容键值对 (key-value)仅存储键
键的唯一性键必须唯一元素必须唯一
访问元素通过键访问对应值,map[key]查找元素是否存在,find(key)
使用场景用于键值对映射,如字典、计数等用于集合操作,如去重、查找是否存在
时间复杂度插入、删除、查找的平均复杂度为 ( O(1) )插入、删除、查找的平均复杂度为 ( O(1) )

4. 注意事项

  1. 无序性
    • 元素的存储顺序与插入顺序无关,取决于哈希函数的实现。
  2. 哈希冲突
    • 哈希表依赖于哈希函数,若哈希冲突严重,会导致性能下降。
  3. 迭代器失效
    • 插入或删除元素后,迭代器可能会失效。
  4. 自定义哈希函数
    • 如果需要存储用户自定义类型,可以通过提供自定义哈希函数实现。

5. 常见应用场景

5.1 去重

使用 unordered_set 去除重复元素:

#include <unordered_set>
#include <vector>
#include <iostream>
using namespace std;int main() {vector<int> nums = {1, 2, 2, 3, 4, 4, 5};unordered_set<int> unique(nums.begin(), nums.end());for (auto& elem : unique) {cout << elem << " ";}return 0;
}

输出:

1 2 3 4 5

5.2 统计元素出现次数

使用 unordered_map 统计字符出现次数:

#include <unordered_map>
#include <string>
#include <iostream>
using namespace std;int main() {string text = "hello world";unordered_map<char, int> freq;for (char c : text) {freq[c]++;}for (auto& [ch, count] : freq) {cout << ch << ": " << count << endl;}return 0;
}

输出:

h: 1
e: 1
l: 3
o: 2: 1
w: 1
r: 1
d: 1

总结

  • unordered_map:适用于存储键值对,快速查找、统计、映射。
  • unordered_set:适用于存储唯一键,快速查找、去重、集合操作。

相关文章:

C++ STL 中的 `unordered_map` 和 `unordered_set` 总结

1. unordered_map unordered_map 是一个基于哈希表实现的容器&#xff0c;存储键值对&#xff08;key-value&#xff09;&#xff0c;每个键必须唯一&#xff0c;可以快速插入、删除、查找。 基本特性 存储结构&#xff1a;键值对 (key-value)。键唯一性&#xff1a;每个键在…...

机器学习基础-概率图模型

&#xff08;一阶&#xff09;马尔科夫模型的基本概念 状态、状态转换概率、初始概率 状态转移矩阵的基本概念 隐马尔可夫模型&#xff08;HMM&#xff09;的基本概念 条件随机场&#xff08;CRF&#xff09;的基本概念 实际应用中的马尔科夫性 自然语言处理&#xff1a; 在词性…...

【MySQL】九、表的内外连接

文章目录 前言Ⅰ. 内连接案例&#xff1a;显示SMITH的名字和部门名称 Ⅱ. 外连接1、左外连接案例&#xff1a;查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 2、右外连接案例&#xff1a;对stu表和exam表联合查询&#xff0c;把…...

芯片详细讲解,从而区分CPU、MPU、DSP、GPU、FPGA、MCU、SOC、ECU

目录 芯片的概念结构 芯片的派系划分 通用芯片&#xff08;CPU&#xff0c;MPU&#xff0c;GPU&#xff0c;DSP&#xff09; 定制芯片&#xff08;FPGA&#xff0c;ASIC&#xff09; 芯片之上的集成&#xff08;MCU&#xff0c;SOC&#xff0c;ECU&#xff09; 软硬件的匹…...

halcon三维点云数据处理(十)locate_cylinder_3d

目录 一、locate_cylinder_3d例程代码二、gen_binocular_rectification_map函数三、binocular_disparity函数四、自定义函数select_best_candidates五、自定义函数remove_shadowed_regions 一、locate_cylinder_3d例程代码 1、读取或者创建3D形状模型&#xff0c; 2、根据双目…...

vue(2,3), react (16及以上)开发者工具资源

在前端开发的广阔领域中&#xff0c;Vue.js 和 React.js 作为两大主流框架&#xff0c;各自拥有庞大的用户群体和丰富的生态系统。为了帮助开发者更高效地进行调试和开发&#xff0c;Vue Devtools 和 React 开发者工具应运而生&#xff0c;成为这两个框架不可或缺的辅助工具。本…...

2025年华为OD上机考试真题(Java)——整数对最小和

题目&#xff1a; 给定两个整数数组array1、array2&#xff0c;数组元素按升序排列。假设从array1、array2中分别取出一个元素可构成一对元素&#xff0c;现在需要取出k对元素&#xff0c;并对取出的所有元素求和&#xff0c;计算和的最小值。 注意&#xff1a;两对元素如果对应…...

进程间通信——网络通信——UDP

进程间通信&#xff08;分类&#xff09;&#xff1a;网络通信、无名管道、有名管道、信号、消息队列、共享内存、信号量集 OSI七层模型&#xff1a;&#xff08;理论模型&#xff09; 应用层 : 要传输的数据信息&#xff0c;如文件传输&#xff0c;电子邮件等 表示层 : 数…...

【我的 PWN 学习手札】IO_FILE 之 FSOP

FSOP&#xff1a;File Stream Oriented Programming 通过劫持 _IO_list_all 指向伪造的 _IO_FILE_plus&#xff0c;进而调用fake IO_FILE 结构体对象中被伪造的vtable指向的恶意函数。 目录 前言 一、glibc-exit函数浅析 二、FSOP 三、Largebin attack FSOP &#xff08;…...

新兴的开源 AI Agent 智能体全景技术栈

新兴的开源 AI Agent 智能体全景技术栈 LLMs&#xff1a;开源大模型嵌入模型&#xff1a;开源嵌入模型模型的访问和部署&#xff1a;Ollama数据存储和检索&#xff1a;PostgreSQL, pgvector 和 pgai后端&#xff1a;FastAPI前端&#xff1a;NextJS缺失的一环&#xff1a;评估和…...

统计学习方法(第二版) 概率分布学习

本文主要介绍机器学习的概率分布&#xff0c;帮助后续的理解。 定义直接从书上搬的想自己写&#xff0c;但没有定义准确&#xff0c;还浪费事件&#xff0c;作为个人笔记&#xff0c;遇到速查。 目录 一、二点分布&#xff08;0-1分布、伯努利分布&#xff09; 二、二项分布…...

淺談Cocos2djs逆向

前言 簡單聊一下cocos2djs手遊的逆向&#xff0c;有任何相關想法歡迎和我討論^^ 一些概念 列出一些個人認為比較有用的概念&#xff1a; Cocos遊戲的兩大開發工具分別是CocosCreator和CocosStudio&#xff0c;區別是前者是cocos2djs專用的開發工具&#xff0c;後者則是coco…...

【ROS2】RViz2加载URDF模型文件

1、RViz2加载URDF模型文件 1)运行RViz2 rviz22)添加组件:RobotModel 3)选择通过文件添加 4)选择URDF文件,此时会报错,需要修改Fixed Frame为map即可 5)因为没有坐标转换,依然会报错,下面尝试解决 2、运行坐标转换节点 1)运行ROS节点:robot_state_publishe...

Unity导入特效,混合模式无效问题

检查spine导出设置与Unity导入设置是否一致 检查Blend Mode Materials是否勾选 检查是否使用导入时产生的对应混合模式的材质&#xff0c;混合模式不适用默认材质 这里选导入时生成的材质...

el-table自定义按钮控制扩展expand

需求&#xff1a;自定义按钮实现表格扩展内容的展开和收起&#xff0c;实现如下&#xff1a; 将type“expand”的表格列的宽度设置为width"1"&#xff0c;让该操作列不展示出来&#xff0c;然后通过ref动态调用组件的内部方法toggleRowExpansion(row, row.expanded)控…...

opencv CV_TM_SQDIFF未定义标识符

opencv CV_TM_SQDIFF未定义标识符 opencv4部分命名发生变换&#xff0c;将CV_WINDOW_AUTOSIZE改为WINDOW_AUTOSIZE&#xff1b;CV_TM_SQDIFF_NORMED改为TM_SQDIFF_NORMED。...

2024acl论文体悟

总结分析归纳 模型架构与训练方法&#xff1a;一些论文关注于改进大语言模型的架构和训练方法&#xff0c;以提高其性能和效率。例如&#xff0c;“Quantized Side Tuning: Fast and Memory-Efficient Tuning of Quantized Large Language Models”提出了一种量化侧调优方法&a…...

【Git原理与使用】版本回退reset 详细介绍、撤销修改、删除文件

目录 一、版本回退 reset 1.1 指令&#xff1a; 1.2 参数说明&#xff1a; 1.3 演示&#xff1a; 二、撤销修改 情况一&#xff1a;对于工作区的代码&#xff0c;还没有 add 情况二&#xff1a;已经 add &#xff0c;但没有 commit 情况三&#xff1a;已经 add &…...

反规范化带来的数据不一致问题的解决方案

在数据库设计中&#xff0c;规范化&#xff08;Normalization&#xff09;和反规范化&#xff08;Denormalization&#xff09;是两个相互对立但又不可或缺的概念。规范化旨在消除数据冗余&#xff0c;确保数据的一致性和准确性&#xff0c;但可能会降低查询效率。相反&#xf…...

【Android】直接使用binder的transact来代替aidl接口

aidl提供了binder调用的封装&#xff0c;有的时候&#xff0c;比如&#xff1a; 1. 懒得使用aidl生成的接口文件&#xff08;确实是懒&#xff0c;Android studio中aidl生成接口文件很方便&#xff09; 2. 服务端的提供者只公开了部分接口出来&#xff0c;只给了调用编号和参…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...

FOPLP vs CoWoS

以下是 FOPLP&#xff08;Fan-out panel-level packaging 扇出型面板级封装&#xff09;与 CoWoS&#xff08;Chip on Wafer on Substrate&#xff09;两种先进封装技术的详细对比分析&#xff0c;涵盖技术原理、性能、成本、应用场景及市场趋势等维度&#xff1a; 一、技术原…...