C++ map插入方式详解及find使用方法

 更新时间:2026年06月05日 09:31:03   作者:Tianwen_Burning  
这段文章详细介绍了C++中std::map的四种插入方式及其特点,包括使用下标运算符[]、emplace、insert和pair等方法,并解释了为何结构体需要无参构造函数以兼容所有插入方式,感兴趣的朋友一起看看吧

1. map的四种插入方式

在C++中,std::map 提供了多种插入元素的方式。以下是四种常用的插入方法:

1.1 使用下标运算符[](最简单)

map1[0] = student(101, "j");

特点:

  • 语法最简洁直观
  • 如果键不存在,会先创建该键,然后赋值
  • 如果键已存在,会覆盖原有的值
  • 需要结构体有默认构造函数(因为会先创建默认对象再赋值)

1.2 使用emplace(C++11推荐)

map1.emplace(60, student(222, "d"));

特点:

  • C++11引入的高效插入方式
  • 直接在map内部构造元素,避免临时对象的创建和拷贝
  • 如果键已存在,不会插入新元素
  • 返回一个pair,first是迭代器,second是bool表示是否插入成功

1.3 使用insert和初始化列表(最易懂)

map1.insert({900, student(500, "rr")});

特点:

  • 使用初始化列表语法,代码清晰易读
  • 如果键已存在,不会插入新元素
  • 返回一个pair,first是迭代器,second是bool表示是否插入成功

1.4 使用insert和pair(最详细但啰嗦)

map1.insert(pair<int, student>(70, student(2000, "bad")));

特点:

  • 显式指定pair类型,代码最详细
  • 如果键已存在,不会插入新元素
  • 可以使用 make_pair 简化:map1.insert(make_pair(70, student(2000, "bad")));

2. find的使用方法

find 方法用于在map中查找指定键的元素:

2.1 基本用法

// 查找键为50的元素
auto it = map1.find(50);

if (it != map1.end()) {
    // 找到了,可以访问元素
    cout << "找到元素: " << it->second.name << endl;
} else {
    // 没找到
    cout << "未找到键为50的元素" << endl;
}

2.2 查找并修改

auto it = map1.find(100);
if (it != map1.end()) {
    // 修改找到的元素
    it->second.name = "修改后的名字";
    it->second.scor = 9999;
}

2.3 查找并删除

auto it = map1.find(60);
if (it != map1.end()) {
    map1.erase(it);  // 删除找到的元素
}

3. 结构体需要无参构造函数的原因

当map的值为结构体时,结构体必须有无参构造函数,原因如下:

3.1 下标运算符[]的要求

map1[0] = student(101, "j");

这行代码实际上执行了两个步骤:

  1. map1[0] - 如果键0不存在,会创建一个默认构造的student对象
  2. = student(101, "j") - 然后将这个默认对象替换为新对象

如果没有无参构造函数,第一步就会失败。

3.2 结构体定义示例

struct student {
    int scor;
    string name;
    
    // 必须有无参构造函数
    student() {
        scor = 0;
        name = "";
    };
    
    // 带参数的构造函数
    student(int scor0, string name0) {
        scor = scor0;
        name = name0;
    };
};

3.3 替代方案

如果不想提供无参构造函数,可以使用以下插入方式:

// 使用insert或emplace,避免使用[]
map1.insert({0, student(101, "j")});
map1.emplace(0, student(101, "j"));

4. 总结对比

插入方式语法简洁度效率键存在时的行为是否需要无参构造函数
map[key] = value★★★★★较低覆盖原有值
emplace()★★★★☆最高不插入
insert({key, value})★★★★☆不插入
insert(pair<>)★★☆☆☆不插入

建议:

  • 需要覆盖已有值时使用 []
  • 通常插入使用 emplaceinsert({})
  • 查找使用 find,记得检查返回值是否等于 end()
  • 结构体作为map值时,建议提供无参构造函数以兼容所有插入方式

到此这篇关于C++ map插入方式详解及find使用方法的文章就介绍到这了,更多相关C++ map插入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言中十六进制转十进制两种实现方法

    C语言中十六进制转十进制两种实现方法

    这篇文章主要介绍了C语言中十六进制转十进制两种实现方法的相关资料,需要的朋友可以参考下
    2017-01-01
  • C++文件关键词快速定位出现的行号实现高效搜索

    C++文件关键词快速定位出现的行号实现高效搜索

    这篇文章主要为大家介绍了C++文件关键词快速定位出现的行号实现高效搜索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 深入了解C++函数重载解析策略

    深入了解C++函数重载解析策略

    这篇文章主要为大家详细介绍了C++中函数重载的解析策略,文中的示例代码讲解详细,对我们学习C++有一定帮助,感兴趣的小伙伴可以了解一下
    2022-10-10
  • 单链表实现反转的3种方法示例代码

    单链表实现反转的3种方法示例代码

    单链表的反转是常见的面试题目,下面这篇文章主要给大家介绍了关于单链表实现反转的3种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • 详解DAG上的DP

    详解DAG上的DP

    DAG:有向无环图。DAG是学习动态规划的基础,很多问题都可以直接转化为DAG上的最长路、最短路或路径计数问题。本文将详细介绍DAG上的DP。
    2021-05-05
  • C语言算法练习之数组元素排序

    C语言算法练习之数组元素排序

    这篇文章主要为大家介绍了C语言算法练习中数组元素排序的实现方法,文中的示例代码讲解详细,对我们学习C语言有一定帮助,需要的可以参考一下
    2022-09-09
  • C++实现并查集

    C++实现并查集

    这篇文章主要为大家详细介绍了C++实现并查集,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C语言函数调用基础应用详解

    C语言函数调用基础应用详解

    函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码。这篇文章主要介绍了c语言是如何处理函数调用的?需要的朋友可以参考下
    2023-02-02
  • C语言编写汉诺塔游戏

    C语言编写汉诺塔游戏

    这篇文章主要介绍了C语言编写汉诺塔游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-11-11
  • C语言中getchar的用法以及实例解析

    C语言中getchar的用法以及实例解析

    getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,下面这篇文章主要给大家介绍了关于C语言中getchar的用法以及实例的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03

最新评论