【C++】STL 容器 - map 关联容器 ① ( std::map 容器简介 | std::map 容器排序规则 | std::map 容器底层实现 )

2024-01-02 09:55:35 浏览数 (2)

文章目录
  • 一、std::map 容器
    • 1、std::map 容器简介
    • 2、std::map 容器排序规则
    • 3、std::map 容器底层实现
  • 二、代码示例 - std::map 容器
    • 1、代码示例
    • 2、执行结果

一、std::map 容器


1、std::map 容器简介

std::map 容器 是 C 语言 标准模板库 ( STL , Standard Template Library ) 提供的 的一个 " 关联容器 " ;

std::map 关联容器 , 提供 一对一数据处理能力 , 容器中的元素自动按键 Key 排序 , 键 Key 和 值 Value 是 一一对应 的 ;

  • 第一个 键 Key 可以称为 关键字 , 每个 关键字 只能在 map 中出现一次 ;
  • 第二个 是 关键字的 值 Value ;

std::map 容器 中 存储的是 键值对 key-value 数据 , 容器中的元素是 键 Key 对 元素 进行自动排序 的 ;

每个键的值在 std::map 容器中都是 唯一的 , 键值不允许重复 ;

在 std::map 容器 中 , 可以 根据 键 Key 快速检索 容器中的 对应 值 Value ;

std::map 容器 的 大小 是 动态调整的 , 在 运行时 增加 / 删除 键值对元素 , 其大小也随之变化 ;

使用 map 集合之前 , 需要导入 <map> 头文件 ;

代码语言:javascript复制
#include "map"

2、std::map 容器排序规则

std::map 容器 中 , 排序规则如下 :

  • 默认排序规则 : 默认的排序规则是 less 仿函数规则 , 即按照 键 的升序进行排列 ;
  • less 仿函数运算 : 在该仿函数中 核心操作就是 调用 元素的 < 运算符 , 如果该元素类型没有重载 < 运算符 , 则会报错 ;
  • 自定义排序规则 : 如果想要自己设置排序规则 , 则 自定义 仿函数 / 函数对象 即可 ;

map 容器必须制定排序规则 , 默认就是 less 排序规则 , 使用该规则的前提是 元素类型可以使用 < 操作符进行运算 , 如果不能进行 < 运算 , 则必须传入一个排序规则 ;

3、std::map 容器底层实现

std::map 容器 底层使用 红黑树 实现 , 这是 平衡二叉树 的变体 数据结构 ;

std::map 容器 与 std::set 容器 底层实现相同 , 区别是 map 容器中存储的是键值对 , set 容器中存储的事单个元素值 ;

使用 红黑树 实现的 std::map 容器 和 std::set 容器 , 其 插入 / 删除 操作 比 线性表 性能要高 ;

  • 线性表 的 插入 / 删除 操作 , 时间复杂度是 O(n) ;
  • 红黑树 的 插入 / 删除 操作 , 时间复杂度是 O(log n) ;

二、代码示例 - std::map 容器


1、代码示例

代码语言:javascript复制
#include "iostream"
using namespace std;
#include "map"
#include "string"


int main() {

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

    myMap["Tom"] = 18;                // 插入键值对 ("Tom", 18)  
    myMap["Jerry"] = 12;              // 插入键值对 ("Jerry", 12)  
    myMap["Trump"] = 80;              // 插入键值对 ("Trump", 80)  

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


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

	return 0;
};

2、执行结果

执行结果 :

Jerry: 12 Tom: 18 Trump: 80 请按任意键继续. . .

0 人点赞