在 C++ 中,掌握常用的数据结构和算法是提升编程能力、优化代码性能和解决复杂问题的关键。以下是 C++ 开发者最应掌握的核心数据结构和算法,按优先级和实用性分类整理:
一、基础数据结构(必须掌握)
1. 数组(Array)
- 特点:固定大小,连续内存,随机访问快(O(1)),插入/删除慢(O(n))。
- C++ 实现:原生数组
int arr[10];
或std::array<int, 10>
(C++11 起,更安全)。 - 应用场景:存储固定数量的数据,如矩阵运算、缓存。
2. 链表(Linked List)
- 特点:动态大小,非连续内存,插入/删除快(O(1)),访问慢(O(n))。
- C++ 实现:
- 单链表:
struct Node { int data; Node* next; };
- 标准库:
std::forward_list
(单向链表)、std::list
(双向链表)。
- 单链表:
- 应用场景:频繁插入/删除的场景(如 LRU 缓存、音乐播放列表)。
3. 栈(Stack)
- 特点:LIFO(后进先出),支持
push
、pop
、top
操作。 - C++ 实现:
- 数组模拟栈。
- 标准库:
std::stack<int>
(默认基于std::deque
实现)。
- 应用场景:函数调用栈、括号匹配、表达式求值。
4. 队列(Queue)
- 特点:FIFO(先进先出),支持
enqueue
、dequeue
、front
操作。 - C++ 实现:
- 数组模拟队列(需处理循环队列)。
- 标准库:
std::queue<int>
(默认基于std::deque
实现)。
- 应用场景:任务调度、广度优先搜索(BFS)、消息队列。
5. 哈希表(Hash Table)
- 特点:通过哈希函数快速定位键值对,平均查找/插入/删除 O(1),最坏 O(n)。
- C++ 实现:
- 标准库:
std::unordered_map<K, V>
(键值对)、std::unordered_set<K>
(唯一键)。
- 标准库:
- 应用场景:快速查找(如字典、缓存、去重)。
6. 字符串(String)
- 特点:动态字符序列,支持拼接、查找、子串等操作。
- C++ 实现:
- C 风格字符串:
char str[] = "hello";
(需手动管理内存)。 - 标准库:
std::string
(推荐,自动管理内存)。
- C 风格字符串:
- 应用场景:文本处理、输入/输出。
二、进阶数据结构(重要且常用)
1. 树(Tree)
- 二叉树(Binary Tree):
- 每个节点最多两个子节点(左/右)。
- C++ 实现:递归或指针结构体。
- 应用场景:文件系统、表达式树。
- 二叉搜索树(BST):
- 左子树 < 根 < 右子树,支持快速查找/插入/删除(平均 O(log n))。
- 平衡 BST:如
std::map
/std::set
的底层实现(红黑树)。
- 堆(Heap):
- 完全二叉树,父节点值 ≥(或 ≤)子节点值(大顶堆/小顶堆)。
- C++ 实现:
std::priority_queue<int>
(默认大顶堆)。 - 应用场景:优先队列、Top K 问题、堆排序。
2. 图(Graph)
- 特点:由节点和边组成,表示对象间的关系。
- C++ 实现:
- 邻接矩阵:
vector<vector<int>> graph(n, vector<int>(n, 0));
- 邻接表:
vector<vector<pair<int, int>>> graph;
(存储边和权重)。
- 邻接矩阵:
- 应用场景:社交网络、路径规划、网络拓扑。
3. 并查集(Disjoint Set Union, DSU)
- 特点:高效管理不相交集合,支持
find
(查根)和union
(合并)操作。 - C++ 实现:数组或指针模拟父节点,路径压缩优化。
- 应用场景:连通性问题(如 Kruskal 最小生成树算法)。
三、核心算法(必须掌握)
1. 排序算法
- 快速排序(Quick Sort):
- 分治思想,平均 O(n log n),最坏 O(n²)(需随机化优化)。
- C++ 实现:
std::sort(arr.begin(), arr.end());
(底层通常是 Introsort,混合快速排序和堆排序)。
- 归并排序(Merge Sort):
- 分治思想,稳定排序,O(n log n),但需要额外空间。
- 堆排序(Heap Sort):
- 利用堆结构,O(n log n),原地排序但不稳定。
- 计数排序/桶排序/基数排序:
- 线性时间排序(O(n)),适用于特定数据范围(如整数、字符串)。
2. 搜索算法
- 二分查找(Binary Search):
- 在有序数组中查找目标值,O(log n)。
- C++ 实现:
std::binary_search(arr.begin(), arr.end(), target);
。
- 深度优先搜索(DFS):
- 递归或栈实现,适用于图/树的遍历、连通性检测。
- 广度优先搜索(BFS):
- 队列实现,适用于最短路径、层级遍历。
3. 动态规划(Dynamic Programming, DP)
- 特点:通过子问题重叠和最优子结构性质,将问题分解为子问题并存储结果。
- 经典问题:
- 斐波那契数列(O(n) 时间,O(1) 空间优化)。
- 背包问题(0-1 背包、完全背包)。
- 最长公共子序列(LCS)。
- C++ 实现:通常用一维或二维数组存储中间结果。
4. 贪心算法(Greedy Algorithm)
- 特点:每一步选择当前最优解,适用于局部最优能推出全局最优的问题。
- 经典问题:
- 跳跃游戏(Jump Game)。
- 区间调度(选择不相交的最大区间数)。
5. 字符串算法
- KMP 算法:
- 高效字符串匹配,O(n + m) 时间复杂度。
- Trie 树(前缀树):
- 用于快速检索字符串集合中的键(如自动补全、拼写检查)。
- Manacher 算法:
- 线性时间查找最长回文子串。
6. 图算法
- Dijkstra 算法:
- 单源最短路径(无负权边),优先队列优化后 O((V + E) log V)。
- Floyd-Warshall 算法:
- 所有节点对最短路径,O(V³),适用于稠密图。
- Kruskal/Prim 算法:
- 最小生成树(MST),适用于带权无向图。
四、C++ 标准库中的高效工具
- 容器:
std::vector
:动态数组,随机访问快。std::deque
:双端队列,支持高效头部插入/删除。std::map
/std::set
:红黑树实现,有序键值对/唯一键。std::unordered_map
/std::unordered_set
:哈希表实现,无序但更快。
- 算法:
std::sort
、std::reverse
、std::unique
、std::lower_bound
等。
- 智能指针:
std::shared_ptr
、std::unique_ptr
:自动管理内存,避免泄漏。
五、学习建议
- 实践优先:通过 LeetCode、HackerRank 等平台刷题(重点练习 数组、链表、树、图、DP、二分查找)。
- 理解原理:不仅会用标准库,还要知道底层实现(如
std::map
是红黑树)。 - 优化代码:掌握时间/空间复杂度分析,避免暴力解法。
- 阅读源码:如 STL 容器和算法的实现(如
std::vector
的内存分配策略)。
总结:C++ 最核心的数据结构和算法
类别 | 关键内容 |
---|---|
基础数据结构 | 数组、链表、栈、队列、哈希表、字符串 |
进阶数据结构 | 树(BST、堆)、图、并查集 |
核心算法 | 排序(快速排序、归并排序)、搜索(二分、DFS/BFS)、DP、贪心、字符串算法(KMP) |
标准库工具 | std::vector 、std::map 、std::unordered_map 、std::sort 、智能指针 |
掌握这些内容后,你能高效解决大多数算法题和实际工程问题(如高性能服务、游戏开发、系统编程)。