当前位置: 首页 > news >正文

C++ Map 和 Set 详解:从原理到实战应用

目录

1. 引言

2. Map 详解

2.1 Map 的基本概念

2.2 Map 的底层实现

2.3 Map 的基本操作

(1)声明与初始化

(2)插入元素

(3)查找元素

(4)遍历 Map

(5)删除元素

3. Set 详解

3.1 Set 的基本概念

3.2 Set 的底层实现

3.3 Set 的基本操作

(1)声明与初始化

(2)插入元素

(3)查找元素

(4)遍历 Set

(5)删除元素

4. Map 和 Set 的对比


1. 引言

在 C++ STL(标准模板库)中,mapset 是两种非常重要的关联容器,它们基于 红黑树(Red-Black Tree) 实现,提供了高效的查找、插入和删除操作。本文将深入探讨它们的 底层原理、使用方法、性能分析,并结合 实际代码示例 进行讲解。

2. Map 详解

2.1 Map 的基本概念

map 是一种 键值对(Key-Value) 存储结构,其中:

  • Key 是唯一的,不能重复。
  • Value 可以重复。
  • 默认按 Key 升序 排序(基于 < 运算符)。

2.2 Map 的底层实现

map 的底层通常采用 红黑树(RB-Tree),保证:

  • 插入、删除、查找 的时间复杂度均为 O(log N)
  • 自动维护 Key 的有序性

2.3 Map 的基本操作

(1)声明与初始化
#include <map>
using namespace std;map<string, int> studentScores;  // Key: string, Value: int
studentScores["Alice"] = 95;
studentScores["Bob"] = 88;
(2)插入元素
studentScores.insert({"Charlie", 90});  // C++11 方式
(3)查找元素
auto it = studentScores.find("Alice");
if (it != studentScores.end()) {cout << "Alice's score: " << it->second << endl;
}
(4)遍历 Map
for (const auto& pair : studentScores) {cout << pair.first << ": " << pair.second << endl;
}
(5)删除元素
studentScores.erase("Bob");  // 按 Key 删除
auto it = studentScores.find("Charlie");
if (it != studentScores.end()) {studentScores.erase(it);  // 按迭代器删除
}

3. Set 详解

3.1 Set 的基本概念

set 是一种 唯一元素集合,特点:

  • 元素唯一,不允许重复。
  • 默认按 升序 排序。

3.2 Set 的底层实现

set 同样基于 红黑树,保证:

  • 插入、删除、查找 的时间复杂度为 O(log N)
  • 自动去重并排序。

3.3 Set 的基本操作

(1)声明与初始化
#include <set>
using namespace std;set<int> numbers = {3, 1, 4, 1, 5};  // 自动去重并排序:{1, 3, 4, 5}
(2)插入元素
numbers.insert(2);  // {1, 2, 3, 4, 5}
numbers.emplace(6); // 更高效
(3)查找元素
auto it = numbers.find(3);
if (it != numbers.end()) {cout << "Found: " << *it << endl;
}
(4)遍历 Set
for (int num : numbers) {cout << num << " ";
}
(5)删除元素
numbers.erase(4);  // 按值删除
auto it = numbers.find(2);
if (it != numbers.end()) {numbers.erase(it);  // 按迭代器删除
}

4. Map 和 Set 的对比

特性mapset
存储方式Key-Value 键值对仅存储 Key
查找方式按 Key 查找 Value直接查找元素
去重Key 唯一元素唯一
排序默认按 Key 升序默认按元素升序
底层结构红黑树(RB-Tree)红黑树(RB-Tree)

http://www.dtcms.com/a/275339.html

相关文章:

  • 基于 Python 的数据分析技术综述
  • 2025 全球酒店用品厂家竞争力排行榜发布:扬州卓韵领衔,布草工厂实力重塑行业格局
  • 未来软件开发的新方向:从工程到智能的深度演进
  • 利用scale实现图片放大案例
  • 商业机密保卫战:如何让离职员工带不走的客户资源?
  • TCP的socket编程
  • 【unity实战】在Unity实现低耦合可复用的交互系统
  • 科技驯服烈日狂沙:中东沙漠农场的光储革命
  • SQL server之版本的初认知
  • 江协科技STM32入门教程——通信接口
  • 希尔排序和选择排序及计数排序的简单介绍
  • 数据湖和数据库对比
  • 笔记-分布式计算基础
  • 可穿戴智能硬件在国家安全领域的应用
  • day4--上传图片、视频
  • WebGL简易教程——结语
  • JVM--虚拟线程
  • 【springcloud】快速搭建一套分布式服务springcloudalibaba(四)
  • leetcode:HJ18 识别有效的IP地址和掩码并进行分类统计[华为机考][字符串]
  • 华为IPD(集成产品开发)流程是其研发管理的核心体系
  • 华为 GaussDB :技术特性、应用局限与市场争议
  • Vue Vue-route (5)
  • C++11的整理笔记
  • 快速排序递归和非递归方法的简单介绍
  • Java文件传输要点
  • 接口测试及常用接口测试工具总结
  • 啤酒自动装箱机构设计cad【10张】+三维图+设计说明书
  • 138-EMD-KPCA-CPO-CNN-BiGRU-Attention模型!
  • Java——面向对象
  • Python-魔术方法-创建、初始化与销毁-hash-bool-可视化-运算符重载-容器和大小-可调用对象-上下文管理-反射-描述器-二分-学习笔记