CCF GESP C++ 六级STL
CCF GESP C++ 六级,涉及的 STL 其实比较集中。对于六级备考,不需要把整个 STL 学完,重点掌握下面这些即可。
一、GESP C++ 六级涉及的 STL 总表
| STL | 主要作用 | 上面哪些模板会用到 | 六级重要程度 |
|---|---|---|---|
vector |
动态数组、邻接表 | DP、树、图、前缀和、背包 | ★★★★★ |
pair |
保存两个数据 | 带权树、排序、坐标 | ★★★★☆ |
string |
字符串处理 | 字符串 DP、字符串划分 | ★★★★★ |
queue |
队列 | BFS | ★★★★☆ |
stack |
栈 | DFS/模拟/括号等 | ★★★☆☆ |
deque |
双端队列 | 队列优化等 | ★★☆☆☆ |
priority_queue |
优先队列 | 贪心、最短路、维护最大/最小值 | ★★★☆☆ |
set |
有序集合、去重 | 贪心、集合问题 | ★★★☆☆ |
map |
有序键值表 | 统计、映射 | ★★★☆☆ |
unordered_set |
哈希集合 | 查重 | ★★☆☆☆ |
unordered_map |
哈希映射 | 计数、映射 | ★★☆☆☆ |
sort() |
排序 | 贪心、排序 | ★★★★★ |
reverse() |
反转 | 数组/字符串 | ★★★☆☆ |
max() / min() |
最大/最小值 | DP、树形 DP | ★★★★★ |
swap() |
交换 | 排序、模拟 | ★★★☆☆ |
abs() |
绝对值 | 树、数学、优化 | ★★★★☆ |
lower_bound() |
二分查找 | 排序、贪心 | ★★★☆☆ |
upper_bound() |
二分查找 | 排序、贪心 | ★★★☆☆ |
二、第一重点:vector
考频:★★★★★
这是你前面要求把树模板统一改成 vector 邻接表后,最重要的 STL。
1. 动态数组
vector<int> a;
加入元素:
a.push_back(10);
a.push_back(20);
访问:
cout << a[0];
cout << a[1];
2. 初始化大小
vector<int> a(n + 1);
例如:
vector<int> dp(n + 1);
vector<int> sz(n + 1);
vector<int> dist(n + 1);
3. 初始化并赋值
vector<int> dp(n + 1, 0);
表示:
创建 n+1 个元素
全部初始化为 0
例如:
vector<int> dist(n + 1, -1);
三、vector + 树的邻接表
考频:★★★★★
这是六级树题最值得掌握的 STL 用法。
vector<vector<int>> g(n + 1);
添加边:
g[u].push_back(v);
g[v].push_back(u);
遍历:
for (int v : g[u])
{
if (v == fa)
continue;
dfs(v, u);
}
所以:
vector
↓
vector<vector<int>>
↓
邻接表
↓
DFS
↓
树形 DP
这实际上是 GESP 六级树题的一条非常重要的 STL 技术链。
四、vector + pair
考频:★★★★☆
处理带权树:
vector<vector<pair<int, int>>> g(n + 1);
例如边:
1 —— 2
5
可以:
g[1].push_back({2, 5});
g[2].push_back({1, 5});
遍历:
for (auto [v, w] : g[u])
{
cout << v << " " << w << endl;
}
这里:
v = 邻接点
w = 边权
五、pair
考频:★★★★☆
pair 用来保存两个相关的数据。
pair<int, int> p;
例如:
pair<int, int> p = {10, 20};
cout << p.first;
cout << p.second;
GESP 中常见用途
① 带权边
pair<int, int>
② 坐标
pair<int, int>
例如:
pair<int, int> point = {3, 5};
③ 排序
vector<pair<int, int>> a;
然后:
sort(a.begin(), a.end());
默认先比较 first,再比较 second。
六、string
考频:★★★★★
虽然前面树模板中没有使用,但是 GESP 六级近年的编程题中,字符串 DP / 字符串划分是需要重点准备的。
例如:
string s;
cin >> s;
常用操作
长度:
s.size()
访问:
s[i]
例如:
for (int i = 0; i < s.size(); i++)
{
cout << s[i];
}
拼接:
s += "abc";
子串:
s.substr(pos, len);
六级重点
尤其需要掌握:
s[i]
s.size()
s.substr()
以及:
string s;
cin >> s;
2025.09 的“划分字符串”就是字符串 + DP 类型。相关题解将其归为字符串划分与 DP。
七、sort()
考频:★★★★★
这是六级非常重要的 STL 算法。
sort(a.begin(), a.end());
从小到大:
sort(a.begin(), a.end());
从大到小:
sort(a.begin(), a.end(), greater<int>());
自定义排序
例如:
struct Node
{
int a;
int b;
};
bool cmp(Node x, Node y)
{
return x.b > y.b;
}
然后:
sort(a.begin(), a.end(), cmp);
八、max() 和 min()
考频:★★★★★
DP 中几乎必然会遇到。
例如:
dp[i] = max(dp[i], dp[j] + value);
树形 DP:
dp[u] = min(dp[u], sum);
求树的最大深度:
depth = max(depth, childDepth + 1);
九、queue
考频:★★★★☆
主要用于 BFS。
queue<int> q;
入队:
q.push(1);
取队头:
int u = q.front();
删除队头:
q.pop();
判断是否为空:
while (!q.empty())
完整 BFS:
queue<int> q;
q.push(1);
dist[1] = 0;
while (!q.empty())
{
int u = q.front();
q.pop();
for (int v : g[u])
{
if (dist[v] != -1)
continue;
dist[v] = dist[u] + 1;
q.push(v);
}
}
十、stack
考频:★★★☆☆
栈:
stack<int> st;
入栈:
st.push(10);
查看栈顶:
st.top();
出栈:
st.pop();
判断:
st.empty();
例如:
while (!st.empty())
{
cout << st.top() << endl;
st.pop();
}
六级目前不建议把 stack 放在第一优先级,但应该会基本使用。
十一、priority_queue
考频:★★★☆☆
优先队列。
默认是大根堆:
priority_queue<int> q;
例如:
q.push(10);
q.push(30);
q.push(20);
cout << q.top();
输出:
30
小根堆
priority_queue<
int,
vector<int>,
greater<int>
> q;
这是以后学习 Dijkstra 等算法时的重要 STL。
不过对于 GESP 六级,优先级低于 vector + sort + queue。
十二、set
考频:★★★☆☆
自动排序 + 自动去重。
set<int> s;
添加:
s.insert(10);
s.insert(5);
s.insert(10);
里面只有:
5
10
遍历:
for (int x : s)
{
cout << x << endl;
}
十三、map
考频:★★★☆☆
键值对应关系:
map<string, int> mp;
例如统计单词:
mp["apple"]++;
mp["banana"]++;
mp["apple"]++;
得到:
apple = 2
banana = 1
遍历:
for (auto p : mp)
{
cout << p.first << " "
<< p.second << endl;
}
十四、unordered_map
考频:★★☆☆☆
哈希表。
unordered_map<int, int> mp;
最常见用途:
mp[x]++;
用于:
统计出现次数
快速查找
映射

浙公网安备 33010602011771号