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)
相关推荐
IvanCodes3 小时前
Python 数据处理(十三):JSON、CSV 与数据序列化
开发语言·python
aramae5 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
qq_2518364577 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
郑州光合科技余经理8 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
知识分享小能手8 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
qq_199886879 小时前
第8板块·第2节:统一内存的高级特性与性能调优
c++·人工智能·gpu算力·cuda
+VX:Fegn08959 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计
阿里嘎多学长9 小时前
2026-09-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
2401_8390805410 小时前
C++常见八股
数据结构·c++·算法
qq_1998868710 小时前
第6板块 第2节 CUDA运行时API与驱动API 核心笔记
c++·人工智能·gpu算力