C++ 基础语法与 STL 速查手册
🧠 基础语法
变量声明
int a = 5; // 整数
double b = 3.14; // 浮点数
char c = 'A'; // 字符
bool flag = true; // 布尔
string s = "hello"; // 字符串
数组
int arr[10]; // 静态数组
int arr2[] = {1,2,3}; // 初始化
vector<int> v(10); // 动态数组
vector<int> v2 = {1,2,3}; // 初始化
循环
// for循环
for(int i = 0; i < 10; i++) {}
// for-each
for(int x : v) {}
// while
while(condition) {}
条件语句
if (condition) {
// do something
} else if (condition2) {
// do something else
} else {
// default
}
🧰 STL 常用容器
1. vector(动态数组)
vector<int> v = {1,2,3};
v.push_back(4); // 添加元素
v.pop_back(); // 删除末尾
v.size(); // 大小
v[0]; // 访问
v.clear(); // 清空
v.empty(); // 是否为空
2. string(字符串)
string s = "hello";
s += " world"; // 拼接
s.substr(0, 5); // 子串
s.find("ell"); // 查找
s.length(); // 长度
reverse(s.begin(), s.end()); // 反转
3. queue(队列)
queue<int> q;
q.push(1); // 入队
q.pop(); // 出队
q.front(); // 队首
q.back(); // 队尾
q.empty(); // 是否为空
4. stack(栈)
stack<int> st;
st.push(1); // 入栈
st.pop(); // 出栈
st.top(); // 栈顶
st.empty(); // 是否为空
5. set(有序集合)
set<int> se;
se.insert(1); // 插入
se.erase(1); // 删除
se.count(1); // 是否存在
se.find(1); // 查找迭代器
se.clear(); // 清空
6. map(键值对)
map<string, int> mp;
mp["key"] = 100; // 插入/修改
mp.count("key"); // 是否存在
mp.erase("key"); // 删除
mp.clear(); // 清空
7. priority_queue(优先队列)
priority_queue<int> pq; // 大根堆
priority_queue<int, vector<int>, greater<int>> pq2; // 小根堆
pq.push(1); // 插入
pq.pop(); // 弹出最大
pq.top(); // 最大元素
🛠️ STL 算法
排序与查找
sort(v.begin(), v.end()); // 升序排序
sort(v.begin(), v.end(), greater<int>()); // 降序
reverse(v.begin(), v.end()); // 反转
unique(v.begin(), v.end()); // 去重(相邻)
binary_search(v.begin(), v.end(), x); // 二分查找
lower_bound(v.begin(), v.end(), x); // 下界
upper_bound(v.begin(), v.end(), x); // 上界
数值操作
max(a, b); // 最大值
min(a, b); // 最小值
swap(a, b); // 交换
abs(x); // 绝对值
gcd(a, b); // 最大公约数(C++17)
容器操作
fill(v.begin(), v.end(), 0); // 填充
count(v.begin(), v.end(), x); // 计数
find(v.begin(), v.end(), x); // 查找
next_permutation(v.begin(), v.end()); // 下一排列
📋 实用技巧
类型别名
using ll = long long;
using vi = vector<int>;
using pii = pair<int, int>;
常用宏
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
输入输出
cin >> x; // 输入
cout << x; // 输出
printf("%.2f\n", x); // 格式化输出
scanf("%d", &x); // C风格输入
🎯 竞赛常用模板
完整头文件
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
常用初始化
vector<int> v(n, 0); // n个0
int arr[1005] = {0}; // 清零
fill(arr, arr + n, 0); // 数组填充
🚀 性能提示
| 操作 |
时间复杂度 |
备注 |
| vector::push_back |
O(1)均摊 |
动态扩容 |
| set::insert |
O(log n) |
有序 |
| map::find |
O(log n) |
红黑树 |
| unordered_map::find |
O(1)平均 |
哈希表 |
二、最大公约数和最小公倍数
#include<bits/stdc++.h>
using namespace std;
int gcd(int a, int b){
return (b==0)?a:gcd(a,a%b);
}
//两个数最大公约数和最小公倍数的乘积等于两数之积
int lcm(int a, int b){
return a / gcd(a,b) * b;//防止a*b溢出
}
int main(){
int a,b;cin>>a>>b;
cout<<gcd(a,b)<<'\n';
cout<<lcm(a,b)<<'\n';
return 0;
}
三、埃氏筛和欧拉筛
#include<bits/stdc++.h>
using namespace std;
const int N = 1e7 +5;
bool is_prime[N];
//埃氏筛质数
void AS_sieve(int n){
fill(is_prime,is_prime+n+1,true);
is_prime[0] = is_prime[1] = false;
for(int i = 2; i * i <= n; i++){
if(is_prime[i]){
for(int j = i * i ; j <= n ; j+=i){
is_prime[j] = false;
}
}
}
}
//欧拉筛质数
void OL_sieve(int n) {
vector<int> primes;
fill(is_prime,is_prime + n + 1,true);
is_prime[0] = is_prime[1] = false;
for(int i = 2; i <= n; i++){
if(is_prime[i]) primes.push_back(i);
for(int j = 0; j <primes.size() && i * primes[j] <= n; j++){
is_prime[i * primes[j]] = false;
if(i % primes[j] == 0) break; //避免进行重复的标记
}
}
}
int main(){
int n;cin>>n;
OL_sieve(n);
int num = 0;
for(int i = 2; i <= n; i++){
if(is_prime[i]) {
cout<<i << " ";
num++;
if(num >= 10 && num % 10 == 0) cout<<'\n';
}
}
return 0;
}
进制转换
k进制转换10进制
//k进制转换成十进制
#include<bits/stdc++.h>
using namespace std;
using ll = long long ;
const int N = 50;
int a[N];
int main(){
string s;
cin>>s;
int k; cin>>k;
int n = s.length();
for(int i = 0; i < n; i++){
a[i] = s[i] - '0';
}
ll res = 0;
for(int i = 0;i < n ; i++){
res = res * k + a[i];
}
cout<<res<<'\n';
return 0;
}