STL 常用函数与容器
STL 常用函数与容器
常用函数与算法模板:min、max、swap、sort;栈 (stack)、队列 (queue)、链表 (list)、向量 (vector) 等容器。
概念
STL 提供泛型容器与算法:vector 动态数组、stack/queue 适配器、list 双向链表;算法 sort、min、max、swap 等经 <algorithm> 调用。容器用 push/pop/size 等成员操作,下标访问 mainly 用于 vector。与手写数组 cspj.cpp.array 的区别:STL 自动管理容量,并有现成算法。与 cspj.ds.stack-and-queue 的区别:后者考数据结构概念与实现,这里考标准库用法。阅读程序 increasingly 出现 std::sort、std::unique、 vector,问改动一行后输出是否变化。
CSP-J 常考
cspj-r1-2025第 24、27 题:阅读程序判断std::unique与数组去重逻辑,或sort相关行为。cspj-r1-2024第 22 题:阅读程序判断,若把dp[i-1]改成dp[i-3]是否影响编译或结果(与vector/数组下标混用场景相关)。
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v = {3, 1, 4, 1, 5};
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
for (int x : v) cout << x << " "; // 1 3 4 5
cout << endl;
易错点
sort默认升序,比较函数写反会导致结果与预期相反;阅读题改比较器要看排序稳定性是否被问。unique只把重复段移到末尾并返回新逻辑尾迭代器,必须配合erase或长度变量才缩短容器,2025 第 24 题即考删去这行后的差异。stack/queue没有[]下标访问,阅读程序若写成q[i]通常不能通过编译。
阅读程序共 1.5 分1 道小题
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
程序
1
#include <iostream>2#include <vector>3using namespace std;45int compute(vector<int>& cost) {6 int n = cost.size();7 vector<int> dp(n+1, 0);8 dp[1] = cost[0];9 for (int i = 2; i <= n; i++) {10 dp[i] = min(dp[i-1], dp[i-2]) + cost[i-1];11 }12 return min(dp[n], dp[n-1]);13}1415int main() {16 int n;17 cin >> n;18 vector<int> cost(n);19 for (int i = 0; i < n; i++) {20 cin >> cost[i];21 }22 cout << compute(cost) << endl;23 return 0;24}- 22判断1.5 分
如果将
dp[i-1]改为dp[i-3],程序可能会产生编译错误。( )
阅读程序共 1.5 分1 道小题
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 A,错误填 B
程序
1
#include <algorithm>2#include <cstdio>3#include <cstring>4#define ll long long5int n, k;6int a[200007];7int ans[200007];8int main() {9 scanf("%d%d", &n, &k);10 for (int i = 1; i <= n; ++i) {11 scanf("%d", &a[i]);12 }13 std::sort(a + 1, a + n + 1);14 n = std::unique(a + 1, a + n + 1) - a - 1;15 for (int i = 1, j = 0; i <= n; ++i) {16 for (; j < i && a[i] - a[j + 1] > k; ++j)17 ;18 ans[i] = ans[j] + 1;19 }20 printf("%d\n", ans[n]);21 return 0;22}- 24判断1.5 分
将第 14 行的
n = std::unique(a + 1, a + n + 1) - a - 1;删去后,有可能出现与原本代码不同的输出结果。( )
阅读程序共 3 分1 道小题
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
程序
1
#include <algorithm>2#include <cstdio>3#include <cstring>4#define ll long long5int n, k;6int a[200007];7int ans[200007];8int main() {9 scanf("%d%d", &n, &k);10 for (int i = 1; i <= n; ++i) {11 scanf("%d", &a[i]);12 }13 std::sort(a + 1, a + n + 1);14 n = std::unique(a + 1, a + n + 1) - a - 1;15 for (int i = 1, j = 0; i <= n; ++i) {16 for (; j < i && a[i] - a[j + 1] > k; ++j)17 ;18 ans[i] = ans[j] + 1;19 }20 printf("%d\n", ans[n]);21 return 0;22}- 27单选3 分
假设输入的 a 数组和 k 均为正整数,但 a 数组不一定有序,则若误删去第 13 行的
std::sort(a + 1, a + n + 1);,程序有可能出现的问题有( )。