前言:标准模板库 STL

这一篇是 labuladong 笔记的第 1 篇,目标是先把刷题最常用的 STL 模板整理成“能直接复制用”的最小集合。

0. 刷题环境提醒

机试常见环境是 C++11,建议先确认编译参数:

  • -std=c++11

常用头文件:

1
2
#include <bits/stdc++.h>
using namespace std;

1. 数据结构:高频 API 清单

1.1 vector

1
2
3
4
5
6
7
8
9
vector<int> a;
vector<int> b(5, 0); // 5个0

a.push_back(3);
a.pop_back();
a.size();
a.empty();
sort(a.begin(), a.end());
reverse(a.begin(), a.end());

1.2 stack / queue / deque

1
2
3
4
5
6
7
8
9
stack<int> st;
st.push(1); st.top(); st.pop(); st.empty();

queue<int> q;
q.push(1); q.front(); q.back(); q.pop();

deque<int> dq;
dq.push_front(1); dq.push_back(2);
dq.front(); dq.back(); dq.pop_front(); dq.pop_back();

1.3 unordered_map / unordered_set

1
2
3
4
5
6
7
8
9
unordered_map<string, int> mp;
mp["apple"] = 1;
mp.count("apple");
mp.find("apple");

unordered_set<int> st;
st.insert(10);
st.count(10);
st.erase(10);

1.4 priority_queue

1
2
3
4
5
6
7
8
9
// 大根堆(默认)
priority_queue<int> maxHeap;

// 小根堆
priority_queue<int, vector<int>, greater<int>> minHeap;

minHeap.push(3);
minHeap.push(1);
minHeap.top(); // 1

2. 算法工具:algorithm / numeric

1
2
3
4
5
6
7
8
vector<int> nums = {4, 1, 7, 2};

sort(nums.begin(), nums.end());
int mn = *min_element(nums.begin(), nums.end());
int mx = *max_element(nums.begin(), nums.end());

int s = accumulate(nums.begin(), nums.end(), 0);
bool has = binary_search(nums.begin(), nums.end(), 7);

3. 两个必备实现

3.1 最大公约数 gcd

1
2
3
4
5
6
7
8
9
int gcd_(int a, int b) {
a = abs(a); b = abs(b);
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}

3.2 最小公倍数 lcm

1
2
3
4
int lcm_(int a, int b) {
if (a == 0 || b == 0) return 0;
return abs(a / gcd_(a, b) * b);
}

4. 第一篇复盘

  • 不追求一次记住全部 STL,而是先掌握“刷题高频 API”。
  • 遇到不熟悉容器时,再回到这篇做速查。
  • 下一篇准备写:基础:数组(静态/动态)