第2章:算法竞赛的C++“瑞士军刀”
欢迎来到你的“武器库”。如果说算法思想是内功心法,那么C++的STL(Standard Template Library,标准模板库)就是我们手中的神兵利器。在机试中,我们追求的不是从零手写数据结构(除非题目明确要求),而是在最短的时间内,用最稳定、最高效的工具解决问题。本章介绍的STL容器和算法,就是为了这个目标而存在的“瑞士军刀”,它们功能强大、身经百战,能帮你轻松应对各种场景。
在学习本章时,不必强求一次性记住所有细节。你可以先快速浏览,对每个工具的功能有个大概印象。在后续学习算法章节时,可以随时回到本章,像查阅字典一样复习和巩固这些“武器”的用法。
核心提示: 在机试中,为了方便,我们通常在代码开头写上 #include <bits/stdc++.h> 和 using namespace std;。前者包含了所有标准库头文件,后者省去了繁琐的 std:: 前缀。虽然这不是规范的工程做法,但在分秒必争的赛场上,这是效率的体现。
2.1 动态数组 vector:最灵活的数组容器
在C++中,普通数组 int a[100]; 的大小在编译时就固定了,无法在程序运行时改变,这在处理不确定数量的数据时非常不便。vector 作为“动态数组”,完美地解决了这个问题。
- 它是什么?
vector是一个可以根据需要自动增长和缩小的数组。 - 为什么用? 它是普通数组的完美替代品,提供了更安全、更灵活的数组操作。
- 怎么用?
- 引入头文件:
#include <vector> - 声明:
vector<int> v; // 声明一个存放 int 的空 vector vector<double> v2(10); // 声明一个包含10个元素的 vector,默认值为0.0 vector<int> v3(10, 6); // 声明一个包含10个元素的 vector,所有元素初始化为6 - 核心操作:
v.push_back(x): 在vector的末尾添加元素x。这是最常用的操作。时间复杂度为均摊 O(1)O(1)O(1)。v.size(): 返回vector中元素的个数。时间复杂度为 O(1)O(1)O(1)。v[i]: 像普通数组一样访问下标为i的元素。时间复杂度为 O(1)O(1)O(1)。v.pop_back(): 删除vector的最后一个元素。v.clear(): 清空vector中的所有元素。v.begin() / v.end(): 返回指向开头和结尾(的下一个位置)的迭代器,常用于配合<algorithm>头文件中的函数(如sort)。
- 引入头文件:
实战代码示例:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
using namespace std;
// 声明一个空的 vector 用于存放整数
vector<int> nums;
cout << "请输入若干整数(输入非数字结束):" << endl;
int x;
// 循环读入,直到输入无效
while (cin >> x) {
nums.push_back(x);
}
cout << "你输入的元素个数是: " << nums.size() << endl;
// 使用 for-each 循环遍历并打印
cout << "元素为: ";
for (int num : nums) {
cout << num << " ";
}
cout << endl;
// 对 vector 进行排序
sort(nums.begin(), nums.end());
cout << "排序后的元素为: ";
for (int num : nums) {
cout << num << " ";
}
cout << endl;
return 0;
}
2.2 字符串 string:操作与技巧
C++的 string 类型远比C语言的字符数组 char[] 强大和易用。它封装了所有常见的字符串操作。
- 它是什么? 一个专门用于处理文本数据的动态字符数组。

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



