C++ STL 提供了丰富的容器和算法组件,是算法竞赛与工程开发中的重要工具。本文重点讲解常用容器的特性、API 及实战技巧。
1. STL 容器概览
C++ STL 提供了六大类容器(按存储方式和访问特性划分):
| 类别 | 容器 | 特点 |
|---|---|---|
| 序列式容器 | , , , |
介绍 C++ STL 核心容器的使用方法及常见技巧。涵盖 vector 动态数组、string 字符串处理、map 与 unordered_map 键值对存储、set 去重查找,以及 stack、queue、priority_queue 等适配器。通过代码示例展示初始化、迭代器、Lambda 表达式等用法,并结合典型题目说明应用场景,如两数之和、Top K 问题等。总结不同容器的时间复杂度与适用场景,帮助开发者高效选择数据结构解决算法问题。
C++ STL 提供了丰富的容器和算法组件,是算法竞赛与工程开发中的重要工具。本文重点讲解常用容器的特性、API 及实战技巧。
C++ STL 提供了六大类容器(按存储方式和访问特性划分):
| 类别 | 容器 | 特点 |
|---|---|---|
| 序列式容器 | , , , |
vectordequelistforward_list| 元素线性排列,可按位置访问 |
| 关联式容器 | set, multiset, map, multimap | 基于红黑树,自动排序,键值唯一或可重复 |
| 无序关联容器 | unordered_set, unordered_map 等 | 基于哈希表,平均 O(1) 查找 |
| 容器适配器 | stack, queue, priority_queue | 封装其他容器,提供特定接口 |
下面重点介绍刷题中最常用的几个。
vector:动态数组之王#include <vector>
using namespace std;
vector<int> v;
// 空 vector
v.push_back(1); // 尾部插入
v.pop_back(); // 尾部删除
v.size(); // 元素个数
v.empty(); // 是否为空
v[0] 或 v.at(0); // 访问元素(at 有边界检查)
v.clear(); // 清空所有元素
vector<int> v1(5, 10); // {10,10,10,10,10}
vector<int> v2 = {1,2,3}; // 列表初始化(C++11)
vector<int> v3(v2); // 拷贝构造
for(auto it = v.begin(); it != v.end();++it){...}
for(int x : v){ cout << x << " "; } // 更简洁!
力扣应用:几乎所有数组类题目都可用
vector代替原生数组,配合sort、lower_bound等函数,事半功倍。
string:不只是字符串string 本质是 vector<char> 的特化,支持大量操作:
string s = "hello";
s.length() 或 s.size(); // 长度
s.substr(1,3); // "ell"(从索引 1 开始取 3 个字符)
s.find("ll"); // 返回子串首次出现位置(未找到返回 string::npos)
s.replace(1,2,"xx"); // 从 1 开始替换 2 个字符为"xx"
s += " world"; // 拼接
reverse(s.begin(), s.end()); // 逆序(需 #include <algorithm>)
#include<string>
stoi("123"); // string to int
to_string(123); // int to string
力扣应用:回文判断、子串匹配、字符串变换类题目常需
substr+sort+==判断字母异位词。
map 与 unordered_map:键值对神器map(有序,基于红黑树)map<string,int> m;
m["apple"]=5;
m["banana"]=3;
for(auto& p : m){ cout << p.first <<": "<< p.second << endl; // 自动按键排序}
unordered_map(无序,哈希表,更快)unordered_map<char,int> freq;
for(char c :"hello") freq[c]++; // 统计字符频次
⚠️ 注意:
map[key]若 key 不存在会自动插入{key, 0},慎用于只读场景!可用.count(key)或.find(key) != .end()判断存在性。
力扣应用:两数之和 →
unordered_map存储值到索引;字母异位词分组 → 用排序后的字符串作 key;前缀和 + 哈希 → 子数组和为 K
set 与 unordered_set:去重与快速查找set<int> s ={3,1,4,1,5}; // 自动去重并排序:{1,3,4,5}
unordered_set<int> us ={3,1,4,1,5}; // 无序,但插入/查找平均 O(1)
if(s.count(4)){/* 存在 */}
力扣应用:判断数组是否有重复 → 插入 set 后比较 size;滑动窗口去重(如最长无重复子串);快速判存在(替代 bool 数组,尤其值域大时)
stack(LIFO)stack<int> st;
st.push(1);
st.top(); // 查看栈顶
st.pop(); // 弹出栈顶
应用:括号匹配、表达式求值、DFS 模拟
queue(FIFO)queue<int> q;
q.push(1);
q.front(); // 队首
q.pop(); // 出队
应用:BFS、层序遍历
priority_queue(堆,默认大顶堆)priority_queue<int> pq; // 大顶堆(最大值在顶)
priority_queue<int, vector<int>, greater<int>> min_pq; // 小顶堆
pq.push(3);
pq.push(1);
pq.push(4);
cout << pq.top(); // 4
力扣经典应用:Top K 问题 → 小顶堆维护 K 个最大元素;合并 K 个有序链表 → 堆存每个链表头;任务调度、带权最短路径(Dijkstra)
string s ="tree";
unordered_map<char,int> freq;
for(char c : s) freq[c]++;
vector<pair<char,int>>vec(freq.begin(), freq.end());
sort(vec.begin(), vec.end(),[](constauto& a,constauto& b){return a.second > b.second;// 频率降序});
priority_queue 实现频率排序auto cmp =[](const pair<char,int>& a,const pair<char,int>& b){return a.second < b.second;// 小顶堆?不!这里要大顶堆,所以用 <};
priority_queue<pair<char,int>, vector<pair<char,int>>,decltype(cmp)>pq(cmp);
提示:
priority_queue的比较函数逻辑与sort相反!sort中a < b表示 a 排在 b 前;priority_queue中a < b表示 b 优先级更高(因为底层是less,但堆顶是最大值)
| 需求 | 推荐容器 |
|---|---|
| 动态数组、随机访问 | vector |
| 字符串处理 | string |
| 快速查重、集合运算 | unordered_set |
| 键值映射、计数 | unordered_map |
| 自动排序的映射 | map |
| LIFO 结构 | stack |
| FIFO 结构 | queue |
| 动态获取最值 | priority_queue |
掌握 STL 容器与算法是解决算法问题的关键。在力扣刷题中,大部分中等题都能通过合理组合 vector、map/set、sort 和 priority_queue 高效解决。
建议初学者:
vector 插入尾部 O(1),中间 O(n);map 插入 O(log n))。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online