【C++】STL 容器 - map 关联容器 ② ( map 容器常用 api 操作 | 容器插入元素操作 - map#insert 函数 | 插入 / 修改 元素操作 - operator[] )






一、map 容器插入元素操作 - map#insert 函数



1、函数原型简介


在 C++ 语言 标准模板库 ( STL , Standard Template Library ) std::map 容器 的 insert 函数 可以 向 map 中插入一个键值对 ;


map#insert 函数原型 :

pair<iterator, bool> insert(const value_type& value);
  • 参数解析 :
    • 参数类型 : value_type 是 map 容器中存储的元素的类型 , 具体类型为 pair<const Key, T> 类型 , Key 是键的类型 , T 是值的类型 ;
    • 参数对象 : 传入的 value 对象 就是一个 pair 对组对象 , 是一个 键值对 元素 ;
  • 返回值解析 : 返回值类型为 pair<iterator, bool> , 也是一个 pair 对组对象 ;
    • 返回值对组的 第一个值是 iterator 迭代器 , 指向已经插入的 键值对 元素 ;
    • 返回值对组的 第二个值是 布尔值 , 表示插入是否成功 ,
      • 如果键 Key 已经存在 , 则插入失败 , 返回 false ;
      • 如果键 Key 不存在 , 则插入新元素 , 返回 true ;

2、pair 键值对初始化方式


在上面的章节中提到 , 调用 map#insert 函数 向 map 容器中插入 键值对元素 , 需要 创建一个 pair<const Key, T> 键值对对象 作为 参数 ;

在 C++ 语言中 , std::pair 类是一个模板类 , 用于存储两个可能不同类型的对象作为一个对组 , 又可以成为键值对 , 第一个对象是 键 Key , 第二个对象是 值 Value ;


以下是创建 std::pair 实例对象的几种方式 :


① 使用默认构造函数 : 下面的 myPair 对组中 , 第一个对象是 字符串类型 , 第二个对象是 int 类型 , 使用默认值初始化 ;

std::pair<string, int> myPair;

② 直接初始化 : 在构造函数中 传入 键值对 的对象值 作为 函数参数 , 直接初始化带值的 pair 对组对象 ;

std::pair<string, int> myPair("Tom", 18);

代码示例 :

    // 创建一个空的 map 容器,键为 string 类型,值为 int 类型
    map<string, int> myMap;   

    // 插入键值对 ("Tom", 18)
    myMap.insert(pair<string, int>("Tom", 18));

③ 直接初始化 : 在构造函数中的 初始化列表 中 传入 键值对 的对象值 , 直接初始化带值的 pair 对组对象 ; 注意 只有在 C++11 以上的版本才能这么用 ;

扫描二维码关注公众号,回复: 17319571 查看本文章
std::pair<string, int> myPair{
    
    "Tom", 18};

④ 调用 make_pair 创建 : 调用 std::make_pair 函数 , 创建 pair 对组对象 ; 下面还是用了类型自动推导 , 真实类型为 std::pair<string, int> ;

auto myPair = std::make_pair("Tom", 18);

代码示例 :

    // 创建一个空的 map 容器,键为 string 类型,值为 int 类型
    map<string, int> myMap;   

    // 插入键值对 ("Jerry", 12)
    myMap.insert(make_pair("Jerry", 12));




二、map 容器 插入 / 修改 元素操作 - map#operator[] 函数



上面的章节中介绍了使用 std::map#insert 函数 插入元素 , 这种插入元素的方式有个弊端 , 就是 如果 键 Key 已经存在 , 则会出现插入失败的情况 ;

这里介绍一种新的插入方式 , 使用 数组下标 的方式进行插入 , 下面的这种插入方式 , 如果键 “Tom” 不存在 , 则正常插入元素 , 如果该键存在 , 则更新元素的 Value 值 ;

    // 创建一个空的 map 容器,键为 string 类型,值为 int 类型
    map<string, int> myMap;   

    // 插入键值对 ("Tom", 19), 修改键值对
    myMap["Tom"] = 19; 

上述的用法实际上是 调用了 重载 [] 操作符函数 , 该重载操作符函数原型如下 :

std::map<Key, T>& operator[](const Key& key);  

上述 函数原型 中的 Key 是 map 关联容器 中键值对元素的 键 类型 , T 是 键值对元素的 值 类型 ;

  • 如果给定的 参数 key 已经存在于 map 关联容器中 , 则更新该 key 对应的 Value 值 , 并返回对应键的值的引用 ;
  • 如果给定的 参数 key 不存在于 map 关联容器中 , 则会在 map 容器中插入一个新的键值对 , 并返回这个新插入的值的引用 ;

注意 : 下面的代码中 , 向 map 容器插入 键值对 , 不是直接插入的 , 而是 先为 “Tom” 键 的对应 int 类型值 默认构造一个默认值 0 , 然后再将 要插入的 19 值 赋值过去 , 这里要执行两个步骤 ;

    // 插入键值对 ("Tom", 19), 修改键值对
    myMap["Tom"] = 19; 




三、代码示例 - map 容器插入 / 更新元素




1、代码示例


代码示例 :

#include "iostream"
using namespace std;
#include "map"
#include "string"


int main() {
    
    

    // 创建一个空的 map 容器,键为 string 类型,值为 int 类型
    map<string, int> myMap;   

    // 插入键值对 ("Tom", 18)
    myMap.insert(pair<string, int>("Tom", 18));

    // 插入键值对 ("Jerry", 12)
    myMap.insert(make_pair("Jerry", 12));

    // 插入键值对 ("Trump", 80)  
    myMap.insert(map<string, int>::value_type("Trump", 80));

    // 插入键值对 ("Tom", 19), 修改键值对
    myMap["Tom"] = 19;   

    // 插入键值对 ("Jack", 15)
    myMap["Jack"] = 15; 
    myMap["Jack"] = 16; 

    // 遍历 map 中的所有元素  
    for (const auto& pair : myMap) {
    
    
        cout << pair.first << ": " << pair.second << endl;  
    }


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

2、执行结果


执行结果 :

Jack: 16
Jerry: 12
Tom: 19
Trump: 80
请按任意键继续. . .

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/han1202012/article/details/135322218