[C++_] set | map | unordered_map

前文回顾:

【C++】详解 set | multiset

【C++】关联容器探秘:Map与Multimap详解

在 C++ 中,mapunordered_map 都是存储键值对的关联容器,但它们的实现和特性有显著区别。如下:


1. 底层实现与有序性

  • map
    基于红黑树(自平衡二叉搜索树)实现,元素按键的升序排列。插入、删除、查找操作的时间复杂度均为 O(log n)
    示例代码
#include <map>
int main() {
    std::map<std::string, int> m;
    m["banana"] = 3;  // 插入无序
    m["apple"] = 5;
    m["cherry"] = 8;
    
    // 遍历时按键升序输出
    for (auto& pair : m)
        std::cout << pair.first << ": " << pair.second << std::endl;
    // 输出顺序:apple:5 → banana:3 → cherry:8
    return 0;
}

特点:有序性支持范围查询(如遍历时按顺序访问)[1] [5]。

  • unordered_map
    基于哈希表实现,元素无序存储,查找、插入、删除的平均时间复杂度为 O(1)(最坏情况 O(n))。
    示例代码
#include <unordered_map>
int main() {
    std::unordered_map<std::string, int> um;
    um["banana"] = 3;
    um["apple"] = 5;
    um["cherry"] = 8;
    
    // 遍历顺序不确定(依赖哈希函数)
    for (auto& pair : um)
        std::cout << pair.first << ": " << pair.second << std::endl;
    // 输出可能为:banana:3 → cherry:8 → apple:5
    return 0;
}

特点:查找速度快,但迭代顺序不可预测 [3] [5]。


2. 性能对比

特性

map

unordered_map

插入/查找时间复杂度

O(log n)

平均 O(1),最坏 O(n)

内存占用

较高(红黑树节点额外存储信息)

较低(哈希表可能需预留空间)

适用场景

需要有序性或范围查询

高频查找且不关心顺序


3. 关键操作示例

// 查找元素
auto it_map = m.find("apple");
if (it_map != m.end()) 
    std::cout << "Found: " << it_map->second << std::endl;

// 哈希表查找(直接通过键访问)
int val = um["apple"];  // 若键不存在,自动插入默认值(如0)

4. 适用场景

  • 选择 map 的情况
    • 需要按键顺序遍历(如输出有序结果)。
    • 要求稳定时间复杂度(避免哈希冲突的最坏情况)[5] [6]。
  • 选择 unordered_map 的情况
    • 高频插入/查找且无需顺序(如缓存、字典)[4] [5]。

总结

mapunordered_map 的核心差异在于 有序性底层数据结构。通过代码示例可见,map 保证元素有序但牺牲部分性能,而 unordered_map 以无序换取了更高的平均效率。开发者需根据具体需求权衡选择 [1] [3] [5]。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/979997.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】TCP三次握手,四次挥手以及SYN,ACK,seq,以及握手次数理解

TCP三次握手图解 描述 第一次握手&#xff1a;客户端请求建立连接&#xff0c;发送同步报文(SYN1)&#xff0c;同时随机一个seqx作为初始序列号&#xff0c;进入SYN_SENT状态&#xff0c;等待服务器确认 第二次握手&#xff1a;服务端收到请求报文&#xff0c;如果同意建立连接…

DVWA -第二关-命令执行

这里是个ping命令的提交框 我们在输入ping命令的时候&#xff0c;同时执行其他命令操作 low 输入127.0.0.||ipconfig 消除乱码的方法&#xff1a;修改dvwaPage.inc.php文件中的”charsetutf-8”&#xff0c;修改”charsetGB2312” 可以显示出来&#xff0c;初级没有过滤 m…

Kibana:Spotify Wrapped 第二部分:深入挖掘数据

作者&#xff1a;来自 Elastic Philipp Kahr 我们将比以往更深入地探究你的 Spotify 数据并探索你甚至不知道存在的联系。 在由 Iulia Feroli 撰写的本系列的第一部分中&#xff0c;我们讨论了如何获取 Spotify Wrapped 数据并在 Kibana 中对其进行可视化。在第 2 部分中&#…

Week2 Using the Java Collection Libraries Lecture 2

1. Java为数据结构编程提供了哪些支持&#xff1f; &#xff08;1&#xff09;Java 提供了丰富的数据结构类&#xff0c;通过 Java 集合框架&#xff08;Java Collections Framework&#xff09; 来实现&#xff0c;常见的包括&#xff1a; Java 集合框架&#xff08;Java Col…

武汉大学生命科学学院与谱度众合(武汉)生命科技有限公司举行校企联培座谈会

2025年2月21日下午&#xff0c;武汉大学生命科学学院与谱度众合&#xff08;武汉&#xff09;生命科技有限公司&#xff08;以下简称“谱度众合”&#xff09;在学院学术厅举行校企联培专业学位研究生合作交流会。武汉大学生命科学学院副院长刘星教授、生命科学学院周宇教授、产…

【随时随地学算法】本地部署hello-algo结合内网穿透远程学习新体验

文章目录 前言1.关于hello-algo2.安装Docker和Docker compose3.本地部署hello-algo4. hello-algo本地访问5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 本篇文章主要介绍如何在本地部署hello-algo算法学习必备项目&#xff0c;并结合cpol…

加油站小程序实战教程03站点管理

目录 1 创建数据源2 搭建后台功能2.1 搭建类目配置功能2.2 配置系统信息2.3 配置站点功能2.4 配置油号功能2.5 配置油枪功能2.6 配置站点菜单2.7 设置站点的操作列 总结 在开发小程序的时候&#xff0c;通常需要先拆解业务对应我们的需求分析&#xff0c;根据需求来推导数据结构…

Vidma Ver.2.14.0 高级版

Vidma Ver.2.14.0 高级版 Vidma 是一款易于使用的视频编辑器&#xff0c;提供多种音乐和流行视频效果选择&#xff0c;让您的视频在社交媒体上脱颖而出。您可以通过添加 swooshing 文本、流行效果、复古滤镜、精美贴纸、平滑过渡等等&#xff0c;轻松地从您的宝贵时刻创建有意…

网络通信/IP网络划分/子网掩码的概念和使用

文章目录 概述子网的考题子网掩码的历史有/无类地址子网划分!子网掩码超网技术/CIDR子网掩码和路由IP子网掩码定义 网络规划网络规划-拆子网网络规划-组超网子网划分案例 区分于其他特殊IP地址IP地址和网络地址子网掩码和网络地址子网掩码和广播地址 子网间的通信其他 概述 本…

win11编译pytorch cuda128版本流程

Geforce 50xx系显卡最低支持cuda128&#xff0c;torch cu128 release版本目前还没有释放&#xff0c;所以自己基于2.6.0源码自己编译wheel包。 1. 前置条件 1. 使用visual studio installer 安装visual studio 2022&#xff0c;工作负荷选择【使用c的桌面开发】,安装完成后将…

一周学会Flask3 Python Web开发-Jinja2模版中加载静态文件

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 一个Web项目不仅需要HTML模板&#xff0c;还需要许多静态文件&#xff0c;比如 CSS、JavaScript文件、图片以及音频等。在Fla…

DeepSeek开源周 Day04:从DualPipe聊聊大模型分布式训练的并行策略

DualPipe简介 今天是DeepSeek开源周的第四天&#xff0c;官方开源了一种新型并行计算优化策略——DualPipe。 其实大家阅读过Deepseek-V3技术报告的同学&#xff0c;对这个技术并不陌生。 开源地址&#xff1a;https://github.com/deepseek-ai/DualPipe 核心亮点 DualPipe&…

基于C#的CANoe CLR Adapter开发指南

一、引言 CANoe 是一款广泛应用于汽车电子开发和测试的工具&#xff0c;它支持多种编程接口&#xff0c;方便开发者进行自定义扩展。CANoe CLR Adapter 允许我们使用 C# 语言与 CANoe 进行交互&#xff0c;充分利用 C# 的强大功能和丰富的类库。本文将详细介绍如何基于 C# 进行…

Redis实现滑动窗口限流实践(Redisson限流器版)

文章目录 一、滑动窗口限流原理二、Redisson限流器三、代码示例1. 引入依赖2. 配置Redis连接3. 使用Redisson限流器4. 使用示例 四、总结五、其他优化方向六、代码说明 在高并发系统中&#xff0c;为了保护系统稳定性&#xff0c;防止突发流量压垮服务&#xff0c;限流是一种常…

实现Python+Django+Transformers库中的BertTokenizer和BertModel来进行BERT预训练,并将其应用于商品推荐功能

一、环境安装准备 #git拉取 bert-base-chinese 文件#创建 虚拟运行环境python -m venv myicrplatenv#刷新source myicrplatenv/bin/activate#python Django 集成nacospip install nacos-sdk-python#安装 Djangopip3 install Django5.1#安装 pymysql settings.py 里面需要 # 强制…

ollama本地部署DeepSeek-R1大模型使用前端JS调用的详细流程

以下是关于如何在本地部署 DeepSeek-R1 大模型&#xff08;通过 Ollama&#xff09;&#xff0c;并使用前端 JavaScript 调用其功能的详细流程。 前提条件 硬件要求&#xff1a; 建议至少 16GB RAM&#xff08;运行较小模型如 1.5B 或 7B 参数版本&#xff09;&#xff0c;如果…

Rocky Linux 8.5 6G内存 静默模式(没图形界面)安装Oracle 19C

Oracle19c 下载地址 Database Software Downloads | Oraclehttps://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_ee 目录 一、准备服务器 1、服务器可以克隆、自己装 2、修改主机名 3、重启 4、关闭selinux 5、关闭防火墙 5.1、…

【Qt QML】QML鼠标事件(MouseArea)

QML鼠标事件全面解析 一、MouseArea基础概念 在 QML 中,鼠标事件是处理用户与界面元素交互的重要部分。QML 提供了多种方式来处理鼠标事件,MouseArea 是 QML 中用于处理鼠标事件的核心元素,它可以覆盖在其他元素之上,捕获鼠标操作并触发相应的信号。 1、基本用法 import …

【Project】基于Prometheus监控docker平台

一、设计背景 1.1项目简介 本项目旨在创建一个全面的容器化应用程序监控解决方案&#xff0c;基于Prometheus监控Docker平台上的各种服务。在当今的软件开发环境中&#xff0c;容器化技术已成为一种关键的工具&#xff0c;使应用程序能够更快速、可靠地交付和扩展。然而&…

SV——Clocking block的应用

在system verilog中&#xff0c;clocking block是一种简化时钟域信号同步和采样的机制。可以帮助验证工程师简化复杂时序问题&#xff0c;尤其是在测试平台中&#xff0c;既要对信号进行驱动&#xff0c;又要对信号进行采样。 clocking block块一般有以下应用场景&#xff1a;…