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)
相关推荐
2401_8920709814 小时前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
yuzhuanhei15 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
Wenweno0o15 小时前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
chenjingming66615 小时前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
cch891815 小时前
Python主流框架全解析
开发语言·python
不爱吃炸鸡柳15 小时前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发15 小时前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
Momentary_SixthSense15 小时前
设计模式之工厂模式
java·开发语言·设计模式
‎ദ്ദിᵔ.˛.ᵔ₎16 小时前
STL 栈 队列
开发语言·c++
勿忘,瞬间16 小时前
数据结构—顺序表
java·开发语言