C++ map容器: 插入操作
1. map插入操作基础
map
是C++ STL中的关联容器,存储键值对(key-value pairs)。插入元素时有四种主要方式,各有特点:
1.1 头文件与声明
#include <map>
using namespace std;map<int, string> mapStu; // 键为int,值为string
2. 四种插入方式详解
2.1 方式一:构造pair后插入
pair<map<int, string>::iterator, bool> ret = mapStu.insert(pair<int, string>(1, "张三"));
特点:
- 显式构造
pair
对象 insert
返回一个pair<iterator, bool>
first
:指向插入元素的迭代器second
:是否插入成功(bool)
示例判断:
if (ret.second == true) {cout << "插入成功!value:" << (*(ret.first)).second << endl;
} else {cout << "插入失败!" << endl; // 键已存在时会失败
}
注意:对于map
,如果键已存在,插入会失败,不会覆盖原有值。
2.2 方式二:使用make_pair
mapStu.insert(make_pair(2, "李四"));
优点:
- 语法更简洁,无需显式指定模板参数
- 自动推导pair类型
- 同样返回
pair<iterator, bool>
2.3 方式三:使用value_type
mapStu.insert(map<int, string>::value_type(3, "王五"));
特点:
value_type
是map内部定义的typedef,等同于pair<const Key, T>
- 类型安全,确保键的类型正确
- 同样返回
pair<iterator, bool>
2.4 方式四:使用[]操作符
mapStu[4] = "赵六"; // 插入
mapStu[4] = "小赵六"; // 修改
关键特性:
- 查找+插入/修改:先查找键是否存在,不存在则插入,存在则修改
- 可能意外插入:访问不存在的键时会自动插入
string strName = mapStu[8]; // 键8不存在时会自动插入
- 返回值:返回值的引用,可直接修改
特殊用法:
mapStu[6] = mapStu[5]; // 复制键5的值到键6
mapStu[7] = mapStu[4]; // 复制键4的值到键7
3. 四种方式对比
特性 | 方式一(pair) | 方式二(make_pair) | 方式三(value_type) | 方式四([]) |
---|---|---|---|---|
语法复杂度 | 高 | 中 | 高 | 低 |
返回值 | pair<iter,bool> | pair<iter,bool> | pair<iter,bool> | 值引用 |
键存在时的行为 | 不覆盖 | 不覆盖 | 不覆盖 | 覆盖 |
可能意外插入 | 否 | 否 | 否 | 是 |
类型安全性 | 高 | 中 | 最高 | 低 |
性能 | 中等 | 中等 | 中等 | 稍快 |
4. 遍历map内容
for (map<int, string>::iterator it = mapStu.begin(); it != mapStu.end(); it++) {cout << it->first << ", " << it->second << endl;
}
或使用C++11范围for循环:
for (const auto& pair : mapStu) {cout << pair.first << ", " << pair.second << endl;
}
5. 关键注意事项
- 键的唯一性:
map
中每个键只能出现一次,重复插入会失败 - 自动排序:元素按键的升序自动排列
- []操作符的风险:
- 可能意外插入新元素
- 访问不存在的键时会用默认值创建新元素
- 性能考虑:
- 插入操作平均时间复杂度O(log n)
- 对于已知不存在的键,使用
insert
比[]
更高效
6. 实际应用建议
- 需要知道是否插入成功:使用
insert
+检查返回值 - 需要覆盖现有值:使用
[]
操作符 - 避免意外插入:先用
find
检查键是否存在 - 代码简洁性:优先考虑
make_pair
或emplace
(C++11)
7. 完整代码回顾
#include <map>
#include <iostream>using namespace std;int main() {map<int, string> mapStu;// 方式一auto ret = mapStu.insert(pair<int, string>(1, "张三"));if (ret.second) {cout << "插入成功!value:" << ret.first->second << endl;} else {cout << "插入失败!" << endl;}// 重复插入测试ret = mapStu.insert(pair<int, string>(1, "小张三"));if (!ret.second) {cout << "插入小张三失败!" << endl;}// 方式二mapStu.insert(make_pair(2, "李四"));// 方式三mapStu.insert(map<int, string>::value_type(3, "王五"));// 方式四mapStu[4] = "赵六";mapStu[4] = "小赵六"; // 覆盖// 特殊用法mapStu[6] = mapStu[5]; // 复制mapStu[7] = mapStu[4]; // 复制// 遍历输出for (const auto& pair : mapStu) {cout << pair.first << ", " << pair.second << endl;}system("pause");return 0;
}
8. 扩展知识
8.1 C++11的emplace
C++11引入了更高效的emplace
方法:
mapStu.emplace(5, "钱七"); // 直接在容器内构造元素,避免临时对象
8.2 异常安全性
insert
和emplace
提供强异常保证:如果插入失败,容器保持不变。
8.3 性能优化
对于大批量插入:
- 如果键已知有序,可以使用提示位置插入:
mapStu.insert(hint_iterator, make_pair(10, "孙八"));
- 或者先构建vector再批量插入
相关文章:
C++ map容器: 插入操作
1. map插入操作基础 map是C STL中的关联容器,存储键值对(key-value pairs)。插入元素时有四种主要方式,各有特点: 1.1 头文件与声明 #include <map> using namespace std;map<int, string> mapStu; // 键为int,值…...
基于STC89C52的红外遥控的电子密码锁设计与实现
一、引言 电子密码锁作为一种安全便捷的门禁系统,广泛应用于家庭、办公室等场景。结合红外遥控功能,可实现远程控制开锁,提升使用灵活性。本文基于 STC89C52 单片机,设计一种兼具密码输入和红外遥控的电子密码锁系统,详细阐述硬件选型、电路连接及软件实现方案。 二、硬…...
Docker配置容器开机自启或服务重启后自启
要将一个 Docker 容器设置为开机自启,你可以使用 docker update 命令或配置 Docker 服务来实现。以下是两种常见的方法: 方法 1:使用 docker update 设置容器自动重启 使用 docker update 设置容器为开机自启 你可以使用以下命令,…...

计算机单个进程内存布局的基本结构
这张图片展示了一个计算机内存布局的基本结构,从低地址(0x00000000)到高地址(0xFFFFFFFF)依次分布着不同的内存区域。 代码段 这是程序代码在内存中的存储区域。它包含了一系列的指令,这些指令是计算机执行…...

我的电赛(简易的波形发生器大一暑假回顾)
DDS算法:当时是用了一款AD9833芯片搭配外接电路实现了一个波形发生,配合stm32f103芯片实现一个幅度、频率、显示的功能; 在这个过程中,也学会了一些控制算法;就比如DDS算法,当时做了一些了解,可…...
AI工程 新技术追踪 探讨
文章目录 一、核心差异维度对比二、GitHub对AI工程师的独特价值三、需要警惕的陷阱四、推荐追踪策略五、与传统开发的平衡建议 以下内容整理来自 deepseek 作为AI工程师,追踪GitHub开源项目 对技术成长和职业发展的影响 比传统应用开发工程师 更为显著,…...

算法题(149):矩阵消除游戏
审题: 本题需要我们找到消除矩阵行与列后可以获得的最大权值 思路: 方法一:贪心二进制枚举 这里的矩阵消除时,行与列的消除会互相影响,所以如果我们先统计所有行和列的总和,然后选择消除最大的那一行/列&am…...
在 Vue 中插入 B 站视频
前言 在 Vue 项目中,有时我们需要嵌入 B 站视频来丰富页面内容,为用户提供更直观的信息展示。本文将详细介绍在 Vue 中插入 B 站视频的多种方法。 使用<iframe>标签直接嵌入,<iframe>标签是一种简单直接的方式,可将 B 站视频嵌…...

printf函数参数与入栈顺序
01. printf()的核心功能 作用:将 格式化数据 输出到 标准输出(stdout),支持多种数据类型和格式控制。 int printf(const char *format, ...);参数: format:格式字符串,字符串或%开头格式符...:…...

仿生眼机器人(人脸跟踪版)系列之一
文章不介绍具体参数,有需求可去网上搜索。 特别声明:不论年龄,不看学历。既然你对这个领域的东西感兴趣,就应该不断培养自己提出问题、思考问题、探索答案的能力。 提出问题:提出问题时,应说明是哪款产品&a…...
08、底层注解-@Configuration详解
# Configuration 注解详解 08、底层注解-Configuration详解 Configuration 是 Spring 框架中用于定义配置类的核心注解,它允许开发者以 Java 代码的形式替代传统的 XML 配置,声明和管理 Bean。 ## 一、基本作用 ### 1. 标识配置类 使用 Configuration…...

Go语言语法---输入控制
文章目录 1. fmt包读取输入1.1. 读取单个值1.2. 读取多个值 2. 格式化输入控制 在Go语言中,控制输入主要涉及从标准输入(键盘)或文件等来源读取数据。以下是几种常见的输入控制方法: 1. fmt包读取输入 fmt包中的Scan和Scanln函数都可以读取输入…...
蓝桥杯单片机按键进阶
蓝桥杯单片机按键进阶 ——基于柳离风老师模板及按键进阶教程 文章目录 蓝桥杯单片机按键进阶1、按键测试-按下生效2、按键进阶-松手生效3、按键进阶-按键禁用(未完待续) 1、按键测试-按下生效 key.c #include "key.h"/*** brief 独立按键…...

CSS- 4.3 绝对定位(position: absolute)学校官网导航栏实例
本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看! 点…...
Flink 作业提交流程
Apache Flink 的 作业提交流程(Job Submission Process) 是指从用户编写完 Flink 应用程序,到最终在 Flink 集群上运行并执行任务的整个过程。它涉及多个组件之间的交互,包括客户端、JobManager、TaskManager 和 ResourceManager。…...
拓展运算符
拓展运算符(Spread Operator)是ES6中引入的新特性,以下是关于它的一些知识点总结: 语法 拓展运算符的语法是三个点(...),它可以将数组或对象展开成多个元素或属性。 数组中的应用 • 数组展…...

Seata源码—6.Seata AT模式的数据源代理一
大纲 1.Seata的Resource资源接口源码 2.Seata数据源连接池代理的实现源码 3.Client向Server发起注册RM的源码 4.Client向Server注册RM时的交互源码 5.数据源连接代理与SQL句柄代理的初始化源码 6.Seata基于SQL句柄代理执行SQL的源码 7.执行SQL语句前取消自动提交事务的源…...

计算机科技笔记: 容错计算机设计05 n模冗余系统 TMR 三模冗余系统
NMR(N-Modular Redundancy,N 模冗余)是一种通用的容错设计架构,通过引入 N 个冗余模块(N ≥ 3 且为奇数),并采用多数投票机制,来提升系统的容错能力与可靠性。单个模块如果可靠性小于…...

Spring Boot 与 RabbitMQ 的深度集成实践(一)
引言 ** 在当今的分布式系统架构中,随着业务复杂度的不断提升以及系统规模的持续扩张,如何实现系统组件之间高效、可靠的通信成为了关键问题。消息队列作为一种重要的中间件技术,应运而生并发挥着举足轻重的作用。 消息队列的核心价值在于其…...

黑马程序员2024新版C++笔记 第2章 语句
1.if逻辑判断语句 语法主体: if(要执行的判断,结果是bool型){判断结果是true会执行的代码; } 2.AI大模型辅助编程 在Clion中搜索并安装对应插件: 右上角齿轮点击后找到插件(TRONGYI LINGMA和IFLYCODE)安装后重启ide即可。 重启后会有通义登…...
HTML5中的Microdata与历史记录管理详解
HTML5中的Microdata与历史记录管理解析 一、Microdata结构化数据 核心属性 itemscope 声明数据范围itemtype 指定数据词汇表(如http://schema.org/Product)itemprop 定义数据属性 <div itemscope itemtype"http://schema.org/Book">…...
上位机知识篇---涂鸦智能云平台
文章目录 前言 前言 本文简单介绍了涂鸦智能云平台。...
面试中的线程题
原文链接:线程题大全 Java 并发库同步辅助类 CountDownLatch 工作机制:初始化一个计数器,此计数器的值表示需要等待的事件数量。 提供了两个主要方法: await():当一个线程调用此方法时,它将阻塞&#…...
济南国网数字化培训班学习笔记-第三组-2-电力通信光缆网认知
电力通信光缆网认知 光缆网架构现状 基础底座 电路系统是高度复杂,实时性、安全性、可靠性要求极高的巨系统,必须建设专用通信网 相伴相生 电力系统是由发电、输电、变电、配电、用电等一次设施,及保障其正常运行的保护、自动化、通信等…...

前端动画库 Anime.js 的V4 版本,兼容 Vue、React
前端动画库 Anime.js 更新了 V4 版本,并对其官网进行了全面更新,增加了许多令人惊艳的效果,尤其是时间轴动画效果,让开发者可以更精确地控制动画节奏。 这一版本的发布不仅带来了全新的模块化 API 和显著的性能提升,还…...

用 PyTorch 从零实现简易GPT(Transformer 模型)
用 PyTorch 从零实现简易GPT(Transformer 模型) 本文将结合示例代码,通俗易懂地拆解大模型(Transformer)从数据预处理到推理预测的核心组件与流程,并通过 Mermaid 流程图直观展示整体架构。文章结构分为四…...
前端JSON序列化中的隐形杀手:精度丢失全解析与实战解决方案
当你在电商平台看到订单ID从 “1298035313029456899” 变成 “1298035313029456900”,或者在金融系统中发现账户余额 100.01 元变成了 100.00999999999999 元时,这很可能遭遇了前端开发中最隐蔽的陷阱之一 —— JSON序列化精度丢失。本文将深入解析这一问…...

【通用大模型】Serper API 详解:搜索引擎数据获取的核心工具
Serper API 详解:搜索引擎数据获取的核心工具 一、Serper API 的定义与核心功能二、技术架构与核心优势2.1 技术实现原理2.2 对比传统方案的突破性优势 三、典型应用场景与代码示例3.1 SEO 监控系统3.2 竞品广告分析 四、使用成本与配额策略五、开发者注意事项六、替…...

Spring3+Vue3项目中的知识点——JWT
全称:JOSN Web Token 定义了一种简洁的、自包含的格式,用于通信双方以json数据格式的安全传输信息 组成: 第一部分:Header(头),记录令牌类型、签名算法等。 第二部分:Payload&am…...

python3GUI--智慧交通分析平台:By:PyQt5+YOLOv8(详细介绍)
文章目录 一.前言二.效果预览1.目标识别与检测2.可视化展示1.车流量统计2. 目标类别占比3. 拥堵情况展示4.目标数量可视化 3.控制台4.核心内容区1.目标检测参数2.帧转QPixmap3.数据管理 5.项目结构 三.总结 平台规定gif最大5M,所以…...