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)
相关推荐
潮汐退涨月冷风霜11 小时前
数字图像处理(1)OpenCV C++ & Opencv Python显示图像和视频
c++·python·opencv
长河12 小时前
Java开发者LLM实战——LangChain4j最新版教学知识库实战
java·开发语言
第七序章12 小时前
【C++STL】list的详细用法和底层实现
c语言·c++·自然语言处理·list
Cyan_RA912 小时前
SpringMVC @RequestMapping的使用演示和细节 详解
java·开发语言·后端·spring·mvc·ssm·springmvc
逆小舟14 小时前
【Linux】人事档案——用户及组管理
linux·c++
再见晴天*_*15 小时前
SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类
java·开发语言·intellij idea
lqjun082716 小时前
Qt程序单独运行报错问题
开发语言·qt
hdsoft_huge18 小时前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
风中的微尘18 小时前
39.网络流入门
开发语言·网络·c++·算法
未来之窗软件服务19 小时前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟