文章目录
- 一、map 容器插入元素操作 - map#insert 函数
- 1、函数原型简介
- 2、pair 键值对初始化方式
- 二、map 容器 插入 / 修改 元素操作 - map#operator[] 函数
- 三、代码示例 - map 容器插入 / 更新元素
- 1、代码示例
- 2、执行结果
一、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 以上的版本才能这么用 ;
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
请按任意键继续. . .