📖 语法速查
← 返回主页
📋 全部知识点一览
📦 变量类型
整型:int
常用

32 位有符号整数,范围 -2³¹ ~ 2³¹-1(约 ±2.1×10⁹)

int a = 42; int b = -100; unsigned int c = 100; // 无符号 0~4.2×10⁹
💡 注意:int 做乘法可能溢出!两个 int 相乘结果用 long long 存。
64 位整型:long long
必用

64 位有符号整数,范围 -2⁶³ ~ 2⁶³-1(约 ±9.2×10¹⁸)

long long x = 1000000000000LL; long long y = 1LL << 60; // 2^60 unsigned long long z = 0;
💡 竞赛标配:怕溢出?直接 long long 解决大多数问题!
浮点数:float/double
常用

float 单精度(6-7 位有效数字)
double 双精度(15-16 位有效数字)

double pi = 3.141592653589793; float f = 3.14f; long double ld = 3.14L;
💡 竞赛:99% 情况用 double 即可。
比较相等用 fabs(a-b) < 1e-9
字符类型:char
常用

存储一个 ASCII 字符,占用 1 字节,也可当作小整数(-128~127)

char ch = 'A'; int code = ch; // 65 char from_num = 97; // 'a'

常用 ASCII:'0'=48 'A'=65 'a'=97

布尔类型:bool
常用

取值 true(1)或 false(0)

bool flag = true; bool is_even = (n % 2 == 0);

任何非零值在条件判断中都视为 true

字符串:string
C++11必用

C++ 标准字符串类

string s = "Hello"; s += " World"; // 拼接 int len = s.size(); // 长度
💡 可以像数组一样用 [] 访问字符。
类型推导:auto
C++11

让编译器自动推导变量类型

auto a = 42; // int auto b = 3.14; // double

注意:引用或要修改时用 auto&

📤 输入输出
标准流:cin/cout
常用

使用 using namespace std;

int n; double d; cin >> n >> d; cout << n << " " << d << endl;
⚡ 加速:比赛时在 main 开头加:ios::sync_with_stdio(false); cin.tie(0);
格式化:scanf/printf
常用

比 cin/cout 快

int n; double d; scanf("%d%lf", &n, &d); printf("%d %.2f\n", n, d);

注意:scanf 的变量前要加 &

读取一行:getline
常用

读取包含空格的整行文本

string line; cin.ignore(); getline(cin, line);
💡cin >> n 之后用 getline 要加 cin.ignore()
文件重定向:freopen
竞赛必备

比赛常用文件输入输出

freopen("problem.in", "r", stdin); freopen("problem.out", "w", stdout);
🚦 流程控制
条件判断:if/else
基础
if (条件) { ... } else if (条件2) { ... } else { ... }

常用条件:a > b x != y a >= b && a <= c !flag

多分支:switch
常用

用于对一个整型/字符型变量的多个取值做分支

switch (op) { case '+': ans = a + b; break; case '-': ans = a - b; break; default: break; }
⚠️ 每个 case 末尾别忘记 break
条件运算符 ? :
常用

简洁的条件表达式

int max_val = (a > b) ? a : b; cout << (score >= 60 ? "Pass" : "Fail");
🔄 循环
循环:for
基础
// 语法:for(初始化; 条件; 更新) for (int i = 0; i < n; i++) { ... } // 倒着走 for (int i = n-1; i >= 0; i--) { ... }

可以省略某些部分:for(;;) 是死循环

循环:while/do-while
基础
while (n > 0) { n--; } do { cout << x; x++; } while (x < 5);
范围 for(C++11)
C++11好用

简洁遍历容器或数组

for (auto x : v) { cout << x; } // 修改元素用引用 for (auto& x : v) { x *= 2; }
break/continue
基础
// break — 跳出整个循环 for (...) { if (...) break; } // continue — 跳过本次循环剩余代码 for (...) { if (i % 2 == 0) continue; }
📦 STL 容器
动态数组:vector
★★★★★

可动态增长的数组,最常用的容器!

vector<int> v; v.push_back(10); v.pop_back(); v.size(); v.clear(); vector<int> a(5, 3); // 5个3
固定大小数组:array
C++11

编译期固定大小的数组

array<int, 5> arr; arr.fill(0); arr[0] = 10;

⚠️ 大小必须在编译期确定

栈:stack
常用

后进先出 (LIFO)

stack<int> st; st.push(10); st.top(); st.pop(); st.empty(); st.size();

应用:括号匹配、DFS、表达式求值

队列:queue
常用

先进先出 (FIFO)

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

应用:BFS、层序遍历

双端队列:deque
常用

两端都能快速插入/删除

deque<int> dq; dq.push_back(1); dq.push_front(2); dq.pop_back(); dq.pop_front(); dq[0]; // 随机访问

应用:滑动窗口、单调队列

优先队列:priority_queue
★★★★

默认最大堆(最大的在顶部)

priority_queue<int> pq; pq.push(10); pq.push(20); pq.top(); // 20

应用:Dijkstra、Huffman、TopK

集合:set/multiset
★★★★

有序集合,自动从小到大排序

set<int> s; s.insert(10); s.count(5); s.erase(10); s.lower_bound(5);

底层红黑树,操作 O(log n)

映射:map/unordered_map
★★★★★

按键值对存储和访问

map<string, int> mp; mp["apple"] = 5; mp.count("apple");

map 有序 O(log n),unordered_map 无序 O(1)

对/元组:pair/tuple
常用

组合多个值

pair<int, int> p = {3, 5}; p.first; p.second;

C++17 结构化绑定:auto [x, y] = p;

⚙️ 常用算法
排序:sort
★★★★★

O(n log n) 快排

sort(v.begin(), v.end()); // 从大到小 sort(v.begin(), v.end(), greater<int>()); // 自定义排序 (lambda) sort(v.begin(), v.end(), [](int a, int b) { return a > b; });
反转:reverse
常用
reverse(v.begin(), v.end()); // 也可用于 string reverse(s.begin(), s.end());
最值:min/max
常用
min(a, b); max(a, b); max({a, b, c}); // C++11 列表 *max_element(v.begin(), v.end());
交换:swap
常用
swap(a, b); swap(v1, v2); // 交换容器
二分查找
★★★★

要求容器已排序

binary_search(v.begin(), v.end(), 5); auto it = lower_bound(v.begin(), v.end(), 5); int idx = it - v.begin();
求和:accumulate
常用
int sum = accumulate(v.begin(), v.end(), 0);
去重:unique
常用

去重标准三步曲

sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end());
全排列:next_permutation
常用
do { // 处理当前排列 } while (next_permutation(v.begin(), v.end()));

⚠️ 初始序列必须升序

🔤 字符串操作
常用方法:string
必会
string s = "Hello World"; s.substr(0, 5); // "Hello" s.find("World"); // 6 s.insert(5, " C++"); s.erase(5, 4);
字符串 ↔ 数字 转换
C++11
string s = to_string(123); int a = stoi("42"); double c = stod("3.14");
字符判断
常用
isdigit('5'); isalpha('a'); islower('a'); isupper('A'); toupper('a'); tolower('A');
字符串流:stringstream
好用
stringstream ss("10 20 30"); int x; while (ss >> x) { cout << x; }
🧮 数学函数
常用数学函数
常用
abs(-5); sqrt(16); pow(2, 10); ceil(3.14); floor(3.14); round(3.5);

注意:pow 返回 double,整数次幂可能有精度问题

最大公约数:__gcd/lcm
C++11+★★★★

C++11/14 竞赛可用(C++17 起用 std::gcd

__gcd(12, 18); // 6 lcm(a, b) = a / __gcd(a, b) * b;
随机数
常用
srand(time(0)); int r = rand() % n; // [0, n-1] // [L, R] 范围 int r2 = rand() % (R-L+1) + L;
位运算基础
★★★★
a & b a | b a ^ b ~a a << b a >> b // 技巧 x & 1 // 检查奇偶 x & (x-1) // 去掉最低位的1
技巧与优化
易冲突的变量名
避坑

#include <bits/stdc++.h> + using namespace std; 后以下名字容易冲突:

// 来自 <cmath> 的数学宏(全局!) int y0, y1, y2; // ❌ 报错!y0/y1/y2 是宏 // 来自 std 命名空间的函数 int next, prev; // ❌ std::next/std::prev int distance; // ❌ std::distance int count; // ❌ std::count int hash; // ❌ std::hash (C++11)
💡 解法:不用 using namespace std; 或避免这些名字;也可用 #define _USE_MATH_DEFINES 前处理。
完整竞赛代码模板
必备
#include <bits/stdc++.h> using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(0); int T; cin >> T; while (T--) { // 你的代码 } return 0; }
常量定义 & 宏
常用
const int MAXN = 100005; const long long INF = 1LL << 60; using ll = long long;
快速 I/O 优化
竞赛必备
ios::sync_with_stdio(false); cin.tie(0);

⚠️ 加了后不要混用 scanf/printf 和 cin/cout

数组初始化:memset/fill
常用
memset(arr, 0, sizeof(arr)); memset(arr, 0x3f, sizeof(arr)); // INF ≈ 10⁹ fill(v.begin(), v.end(), -1);
💡 memset(arr, 0x3f, sizeof(arr)) 是竞赛中设置 INF 的经典写法!