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

目录

[1. 引言](#1. 引言)

[2. Map 详解](#2. Map 详解)

[2.1 Map 的基本概念](#2.1 Map 的基本概念)

[2.2 Map 的底层实现](#2.2 Map 的底层实现)

[2.3 Map 的基本操作](#2.3 Map 的基本操作)

(1)声明与初始化

(2)插入元素

(3)查找元素

[(4)遍历 Map](#(4)遍历 Map)

(5)删除元素

[3. Set 详解](#3. Set 详解)

[3.1 Set 的基本概念](#3.1 Set 的基本概念)

[3.2 Set 的底层实现](#3.2 Set 的底层实现)

[3.3 Set 的基本操作](#3.3 Set 的基本操作)

(1)声明与初始化

(2)插入元素

(3)查找元素

[(4)遍历 Set](#(4)遍历 Set)

(5)删除元素

[4. Map 和 Set 的对比](#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)插入元素
cpp 复制代码
studentScores.insert({"Charlie", 90});  // C++11 方式
(3)查找元素
cpp 复制代码
auto it = studentScores.find("Alice");
if (it != studentScores.end()) {
    cout << "Alice's score: " << it->second << endl;
}
(4)遍历 Map
cpp 复制代码
for (const auto& pair : studentScores) {
    cout << pair.first << ": " << pair.second << endl;
}
(5)删除元素
cpp 复制代码
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)声明与初始化
cpp 复制代码
#include <set>
using namespace std;

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

4. Map 和 Set 的对比

特性 map set
存储方式 Key-Value 键值对 仅存储 Key
查找方式 按 Key 查找 Value 直接查找元素
去重 Key 唯一 元素唯一
排序 默认按 Key 升序 默认按元素升序
底层结构 红黑树(RB-Tree) 红黑树(RB-Tree)
相关推荐
大宝剑1702 分钟前
python环境安装
开发语言·python
lly20240615 分钟前
CSS3 多媒体查询
开发语言
保持低旋律节奏18 分钟前
C++——list链表
c++·链表·list
天***88961 小时前
js封装一个双精度算法实现
开发语言·前端·javascript
.小小陈.1 小时前
数据结构2:单链表
c语言·开发语言·数据结构·笔记·学习方法
Camel卡蒙1 小时前
数据结构——二叉搜索树Binary Search Tree(介绍、Java实现增删查改、中序遍历等)
java·开发语言·数据结构
2401_841495641 小时前
【数据结构】基于Floyd算法的最短路径求解
java·数据结构·c++·python·算法··floyd
Algebraaaaa1 小时前
什么是前端、后端与全栈开发,Qt属于什么?
开发语言·前端·qt
立志成为大牛的小牛2 小时前
数据结构——二十三、并查集的终极优化(王道408)
开发语言·数据结构·笔记·学习·程序人生·考研
纵有疾風起2 小时前
C++模版:模板初阶及STL简介
开发语言·c++·经验分享·开源