C++ map容器: 插入操作

news2025/5/19 8:18:53

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] = "小赵六";    // 修改

关键特性

  1. 查找+插入/修改:先查找键是否存在,不存在则插入,存在则修改
  2. 可能意外插入:访问不存在的键时会自动插入
    string strName = mapStu[8];  // 键8不存在时会自动插入
    
  3. 返回值:返回值的引用,可直接修改

特殊用法

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. 关键注意事项

  1. 键的唯一性map中每个键只能出现一次,重复插入会失败
  2. 自动排序:元素按键的升序自动排列
  3. []操作符的风险
    • 可能意外插入新元素
    • 访问不存在的键时会用默认值创建新元素
  4. 性能考虑
    • 插入操作平均时间复杂度O(log n)
    • 对于已知不存在的键,使用insert[]更高效

6. 实际应用建议

  1. 需要知道是否插入成功:使用insert+检查返回值
  2. 需要覆盖现有值:使用[]操作符
  3. 避免意外插入:先用find检查键是否存在
  4. 代码简洁性:优先考虑make_pairemplace(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 异常安全性

insertemplace提供强异常保证:如果插入失败,容器保持不变。

8.3 性能优化

对于大批量插入:

  1. 如果键已知有序,可以使用提示位置插入:
    mapStu.insert(hint_iterator, make_pair(10, "孙八"));
    
  2. 或者先构建vector再批量插入

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机单个进程内存布局的基本结构

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

我的电赛(简易的波形发生器大一暑假回顾)

DDS算法&#xff1a;当时是用了一款AD9833芯片搭配外接电路实现了一个波形发生&#xff0c;配合stm32f103芯片实现一个幅度、频率、显示的功能&#xff1b; 在这个过程中&#xff0c;也学会了一些控制算法&#xff1b;就比如DDS算法&#xff0c;当时做了一些了解&#xff0c;可…

算法题(149):矩阵消除游戏

审题&#xff1a; 本题需要我们找到消除矩阵行与列后可以获得的最大权值 思路&#xff1a; 方法一&#xff1a;贪心二进制枚举 这里的矩阵消除时&#xff0c;行与列的消除会互相影响&#xff0c;所以如果我们先统计所有行和列的总和&#xff0c;然后选择消除最大的那一行/列&am…

printf函数参数与入栈顺序

01. printf()的核心功能 作用&#xff1a;将 格式化数据 输出到 标准输出&#xff08;stdout&#xff09;&#xff0c;支持多种数据类型和格式控制。 int printf(const char *format, ...);参数&#xff1a; format&#xff1a;格式字符串,字符串或%开头格式符...&#xff1a;…

仿生眼机器人(人脸跟踪版)系列之一

文章不介绍具体参数&#xff0c;有需求可去网上搜索。 特别声明&#xff1a;不论年龄&#xff0c;不看学历。既然你对这个领域的东西感兴趣&#xff0c;就应该不断培养自己提出问题、思考问题、探索答案的能力。 提出问题&#xff1a;提出问题时&#xff0c;应说明是哪款产品&a…

Go语言语法---输入控制

文章目录 1. fmt包读取输入1.1. 读取单个值1.2. 读取多个值 2. 格式化输入控制 在Go语言中&#xff0c;控制输入主要涉及从标准输入(键盘)或文件等来源读取数据。以下是几种常见的输入控制方法&#xff1a; 1. fmt包读取输入 fmt包中的Scan和Scanln函数都可以读取输入&#xf…

CSS- 4.3 绝对定位(position: absolute)学校官网导航栏实例

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 点…

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&#xff08;N-Modular Redundancy&#xff0c;N 模冗余&#xff09;是一种通用的容错设计架构&#xff0c;通过引入 N 个冗余模块&#xff08;N ≥ 3 且为奇数&#xff09;&#xff0c;并采用多数投票机制&#xff0c;来提升系统的容错能力与可靠性。单个模块如果可靠性小于…

Spring Boot 与 RabbitMQ 的深度集成实践(一)

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

黑马程序员2024新版C++笔记 第2章 语句

1.if逻辑判断语句 语法主体&#xff1a; if(要执行的判断&#xff0c;结果是bool型){判断结果是true会执行的代码; } 2.AI大模型辅助编程 在Clion中搜索并安装对应插件&#xff1a; 右上角齿轮点击后找到插件(TRONGYI LINGMA和IFLYCODE)安装后重启ide即可。 重启后会有通义登…

前端动画库 Anime.js 的V4 版本,兼容 Vue、React

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

用 PyTorch 从零实现简易GPT(Transformer 模型)

用 PyTorch 从零实现简易GPT&#xff08;Transformer 模型&#xff09; 本文将结合示例代码&#xff0c;通俗易懂地拆解大模型&#xff08;Transformer&#xff09;从数据预处理到推理预测的核心组件与流程&#xff0c;并通过 Mermaid 流程图直观展示整体架构。文章结构分为四…

【通用大模型】Serper API 详解:搜索引擎数据获取的核心工具

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

Spring3+Vue3项目中的知识点——JWT

全称&#xff1a;JOSN Web Token 定义了一种简洁的、自包含的格式&#xff0c;用于通信双方以json数据格式的安全传输信息 组成&#xff1a; 第一部分&#xff1a;Header&#xff08;头&#xff09;&#xff0c;记录令牌类型、签名算法等。 第二部分&#xff1a;Payload&am…

python3GUI--智慧交通分析平台:By:PyQt5+YOLOv8(详细介绍)

文章目录 一&#xff0e;前言二&#xff0e;效果预览1.目标识别与检测2.可视化展示1.车流量统计2. 目标类别占比3. 拥堵情况展示4.目标数量可视化 3.控制台4.核心内容区1.目标检测参数2.帧转QPixmap3.数据管理 5.项目结构 三&#xff0e;总结 平台规定gif最大5M&#xff0c;所以…

Linux任务管理与守护进程

一、任务管理 &#xff08;一&#xff09;进程组、作业、会话概念 &#xff08;1&#xff09;进程组概念&#xff1a;进程组是由一个或多个进程组成的集合&#xff0c;这些进程在某些方面具有关联性。在操作系统中&#xff0c;进程组是用于对进程进行分组管理的一种机制。每个…

C#里与嵌入式系统W5500网络通讯(2)

在嵌入式代码里,需要从嵌入式的MCU访问W5500芯片。 这个是通过SPI通讯来实现的,所以要先连接SPI的硬件通讯线路。 接着下来,就是怎么样访问这个芯片了。 要访问这个芯片,需要通过SPI来发送数据,而发送数据又要有一定的约定格式, 于是芯片厂商就定义下面的通讯格式: …

EMQX开源版安装指南:Linux/Windows全攻略

EMQX开源版安装教程-linux/windows 因最近自己需要使用MQTT&#xff0c;需要搭建一个MQTT服务器&#xff0c;所以想到了很久以前用到的EMQX。但是当时的EMQX使用的是开源版的&#xff0c;在官网可以直接下载。而现在再次打开官网时发现怎么也找不大开源版本了&#xff0c;所以…

【计算机视觉】OpenCV实战项目:GraspPicture 项目深度解析:基于图像分割的抓取点检测系统

GraspPicture 项目深度解析&#xff1a;基于图像分割的抓取点检测系统 一、项目概述项目特点 二、项目运行方式与执行步骤&#xff08;一&#xff09;环境准备&#xff08;二&#xff09;项目结构&#xff08;三&#xff09;执行步骤 三、重要逻辑代码解析&#xff08;一&#…