C++ 进阶 — 第 1 课
sort 一行排序,比自己写的快得多。set 自动去重,还帮你排好序。map 是键值对,统计次数最好用。#include <algorithm> // sort 在这里
vector<int> v = {5, 3, 8, 1, 2};
sort(v.begin(), v.end()); // 升序:1 2 3 5 8
sort(v.begin(), v.end(), greater<int>()); // 降序:8 5 3 2 1
复杂度 O(n log n),比你手写的冒泡 O(n²) 快得多。
int arr[] = {5, 3, 8, 1, 2};
sort(arr, arr + 5); // arr 现在 = {1, 2, 3, 5, 8}
vector<int> v = {5, 3, 8, 1, 2};
auto it = find(v.begin(), v.end(), 8);
if (it != v.end())
cout << "找到了,下标: " << (it - v.begin()) << endl;
else
cout << "没找到" << endl;
find 返回的不是下标,是“指向元素的位置”。it - v.begin() 才换算成下标。auto 让编译器自动推断类型,不用手写 vector<int>::iterator。
#include <set>
set<int> s;
s.insert(3); s.insert(1); s.insert(4); s.insert(1); s.insert(5);
for (int x : s) cout << x << " "; // 1 3 4 5(自动去重+排序!)
| 操作 | 代码 | 说明 |
|---|---|---|
| 插入 | s.insert(x) | 重复的自动忽略 |
| 删除 | s.erase(x) | 不存在就什么也不做 |
| 查找 | s.count(x) | 存在返 1,不存在返 0 |
vector<int> v = {3, 1, 4, 1, 5, 4};
set<int> s(v.begin(), v.end()); // 丢进 set,自动去重排序
for (int x : s) cout << x << " "; // 1 3 4 5
你之前写了 15 行嵌套循环的去重,现在两行搞定。
#include <map>
map<string, int> score; // 名字 → 分数
score["Alice"] = 95;
score["Bob"] = 87;
score["Alice"] = 96; // 更新
cout << score["Alice"]; // 96
cout << score["Charlie"]; // 0(不存在的 key 自动创建为 0)
// 安全查找
if (score.count("Bob")) cout << "Bob 存在";
for (auto& p : score) {
cout << p.first << ": " << p.second << endl;
}
// Alice: 96
// Bob: 87
p.first 是 key,p.second 是 value。
pair<int, int> p = {3, 7};
cout << p.first; // 3
cout << p.second; // 7
常跟 vector 配合:vector<pair<int, int>> v; 存一堆坐标或边。
| 场景 | 用啥 | 头文件 |
|---|---|---|
| 排序 | sort(begin, end) | <algorithm> |
| 查找 | find(begin, end, val) | <algorithm> |
| 反转 | reverse(begin, end) | <algorithm> |
| 最值 | max(a, b) / min(a, b) | <algorithm> |
| 去重排序 | set<T> | <set> |
| 键值映射 | map<K, V> | <map> |
| 配对 | pair<A, B> | <utility> |
| 交换 | swap(a, b) | <utility> |
vector、set、map 是容器(存东西的);sort、find、reverse 是算法(处理东西的)。两者靠迭代器对接。
find 返回迭代器不是下标:要下标得自己减,写 it - v.begin()。find 的结果前先判 it != v.end():等于 v.end() 就是没找到,此时解引用它没有意义。map[key] 会偷偷插入:key 不存在时自动建一个值为 0 的项;只查询请用 count()。set 元素是只读的:改元素会破坏它内部的排序结构,要改就先 erase 再 insert。sort / find / reverse 在 <algorithm>,set、map 各在自己那个头文件里。set<int> s = {3, 1, 3, 2}; s 里有几个元素?sort 和手写冒泡排序区别是什么?map 中访问不存在的 key 会发生什么?sort 从小到大输出。map 统计每个单词出现了几次,按字典序输出。apple banana apple cat banana apple → apple: 3 banana: 2 cat: 1<algorithm>、<set>、<map> 各管一摊。begin 或类型不对:先检查容器名写没写错、是不是空的。find 的结果没判 != v.end() 就解引用,是最常见的崩溃来源。size() 和内容打印一遍,确认数据到底进去没有。sort(v.begin(), v.end()) 一行排序;降序加 greater<int>()。it - v.begin()。[] 会插入不存在的 key。vector 存着,排序时很容易对不上号。下一课把这些相关的数据捆成一个整体,就是 struct;再加上成员函数,就成了 class。