备战蓝桥杯之———C++语法入门基础
本篇旨在入门基础框架构建帮助快速上手相关C内容针对蓝桥杯比赛C使用特点时间限制严格输入输出量大常用STL简化代码。接下来面向蓝桥杯备战的C语法入门指南帮助入门快速掌握常用语法和技巧1. 开发环境与编译选项· 蓝桥杯官方评测环境通常支持 C11 / C14 / C17建议使用 C11 或更高版本。· 本地练习时推荐使用 Dev-C、Code::Blocks、VS Code 或 CLion并开启 -stdc11 或 -stdc14 编译选项。2. 常用头文件竞赛必备#include iostream // 输入输出流 #include cstdio // scanf, printf #include cstring // memset, strlen, strcmp #include algorithm // sort, max, min, lower_bound... #include vector // vector #include set // set #include map // map #include queue // queue, priority_queue #include stack // stack #include cmath // sqrt, pow, fabs... #include string // string #include sstream // stringstream #include bits/stdc.h // 万能头文件部分评测环境支持但谨慎使用注意万能头文件 bits/stdc.h 在部分 OJ 中可用但在蓝桥杯评测中可能不支持建议使用具体头文件确保兼容。3. 快速输入输出IO 优化竞赛中大数据量输入输出时cin/cout 默认较慢可使用以下加速技巧ios::sync_with_stdio(false); // 解除 cin 与 stdio 的同步 cin.tie(0); // 解除 cin 与 cout 的绑定 cout.tie(0);之后可正常使用cin、cout速度与scanf、printf相近。若使用scanf / printf· scanf(%d, x); 读取整数· printf(%d\n, x); 输出整数并换行注意混用cin/cout与scanf/printf可能导致同步问题启用ios::sync_with_stdio(false)后应只使用cin/cout4. 常用数据类型与常量· 整数int32位约 ±2e9long long64位约 ±9e18常用typedef long long ll;· 浮点数double精度更高慎用float· 布尔bool使用true/false· 常量定义const int INF 0x3f3f3f3f; 表示无穷大常用memset初始化数组5. 数组与动态数组vector静态数组int arr[1005]; // 栈上分配大小固定 memset(arr, 0, sizeof(arr)); // 初始化全0仅适用于整数数组按字节赋值注意数组开大需放在全局作用域静态存储区避免栈溢出vector动态数组推荐#include vector vectorint v; // 空 vector vectorint v(10); // 10个0 vectorint v(10, 5); // 10个5 v.push_back(3); // 尾部添加元素 v.pop_back(); // 删除尾部元素 v.size(); // 元素个数 v.empty(); // 是否为空 v.clear(); // 清空 v[0] 1; // 下标访问不检查越界 v.at(0); // 下标访问越界抛出异常 // 遍历 for (int i 0; i v.size(); i) cout v[i] ; for (auto it v.begin(); it ! v.end(); it) cout *it ; for (int x : v) cout x ; // C11 范围 for6. 字符串处理C风格字符串char数组char s[100]; scanf(%s, s); // 读取到空白字符 gets(s); // 读取整行不安全蓝桥杯可能禁用 fgets(s, 100, stdin); // 安全读取一行保留换行符 printf(%s\n, s);C string推荐#include string string s; getline(cin, s); // 读取一行包含空格 cin s; // 读取到空白字符 s.length(); // 长度 s.empty(); // 是否空 s.substr(pos, len); // 子串 s.find(abc); // 查找子串返回下标未找到返回 string::npos s.replace(pos, len, str);// 替换 s.append(world); // 追加 s !; // 拼接 // 数字与字符串转换C11 int num stoi(s); // string 转 int string str to_string(123); // 数字转 string7. 常用 STL 容器set / unordered_set集合setint s; s.insert(5); // 插入 s.erase(5); // 删除 if (s.find(5) ! s.end()) // 查找 cout found; s.count(5); // 返回1或0set中元素唯一 // 遍历 for (int x : s) cout x ;· set 基于红黑树有序插入/查找 O(log n)· unordered_set 基于哈希表无序平均 O(1)map / unordered_map映射mapstring, int mp; mp[apple] 5; // 插入/修改 mp.erase(apple); // 删除 if (mp.count(banana)) // 查找 cout mp[banana]; // 遍历 for (auto p : mp) { cout p.first : p.second endl; }stack栈stackint st; st.push(1); // 压栈 st.pop(); // 出栈无返回值 int top st.top(); // 栈顶元素 st.empty(); // 判空queue队列queueint q; q.push(1); // 入队 q.pop(); // 出队 int front q.front(); // 队首 int back q.back(); // 队尾priority_queue优先队列默认大顶堆priority_queueint pq; pq.push(3); pq.push(1); pq.push(2); while (!pq.empty()) { cout pq.top() ; // 输出 3 2 1 pq.pop(); }小顶堆priority_queueint, vectorint, greaterint pq; // 小顶堆deque双端队列dequeint dq; dq.push_front(1); dq.push_back(2); dq.pop_front(); dq.pop_back();pair对pairint, string p(1, hello); cout p.first p.second; // 常用于 map 插入 mp.insert({3, three});8. 常用算法函数algorithmsortvectorint v {3, 1, 4, 1, 5}; sort(v.begin(), v.end()); // 升序 sort(v.begin(), v.end(), greaterint()); // 降序 sort(v.begin(), v.end(), [](int a, int b) { return a b; }); // 自定义比较对数组sort(arr, arr n);二分查找有序容器vectorint v {1, 2, 4, 5, 5, 6}; bool found binary_search(v.begin(), v.end(), 5); // 是否存在 auto it lower_bound(v.begin(), v.end(), 5); // 第一个 5 的位置 auto it2 upper_bound(v.begin(), v.end(), 5); // 第一个 5 的位置 int index it - v.begin(); // 转换为下标其他常用reverse(v.begin(), v.end()); // 反转 max(a, b); min(a, b); // 最大最小值 swap(a, b); // 交换 next_permutation(v.begin(), v.end()); // 下一个排列 unique(v.begin(), v.end()); // 去重需先排序 accumulate(v.begin(), v.end(), 0); // 累加需头文件 numeric9. 结构体与运算符重载常用于自定义数据类型排序或放入 set、map 等容器。struct Point { int x, y; // 构造函数 Point(int _x, int _y) : x(_x), y(_y) {} // 重载小于号用于 set 或 sort bool operator (const Point other) const { if (x ! other.x) return x other.x; return y other.y; } }; // 使用 vectorPoint pts; pts.push_back(Point(1,2)); sort(pts.begin(), pts.end());10. 位运算技巧常用于状态压缩、快速计算· 判断奇偶x 1· 乘除 2 的幂x 1乘2x 1除2· 取最低位的 1x -x· 将第 k 位置 1x | (1 k)· 将第 k 位置 0x ~(1 k)· 判断第 k 位是否为 1(x k) 111. 数学函数#include cmath double sqrt(double); // 平方根 double pow(double, double); // 幂 double fabs(double); // 绝对值 int abs(int); // 绝对值整数注意整数平方根可使用 int(sqrt(n))注意浮点误差可加 0.5 或使用 sqrt(n 0.5)12. 内存与动态分配竞赛中尽量使用全局数组或 STL 容器避免手动 new/delete以免内存泄漏。· 全局数组int arr[1000005];在函数外定义· 动态数组推荐 vector无需手动释放13. 常见错误与注意事项· 数组越界定义数组时留出足够空间避免访问 arr[n]· 整数溢出使用 long long 防止乘法、加法溢出· 多组输入注意清空容器、重置变量· 格式输出注意空格和换行避免多输出或少输出· 浮点数比较使用 fabs(a-b) 1e-9 代替 a b· 递归深度深递归可能导致栈溢出考虑迭代或增加栈空间14. 实战模板#include iostream #include vector #include algorithm using namespace std; typedef long long ll; int main() { ios::sync_with_stdio(false); cin.tie(0); // 你的代码 return 0; }15. 蓝桥杯常见题型与对应语法· 枚举、模拟循环、条件、数组、字符串· 排序sort自定义比较· 查找二分查找、lower_bound、upper_bound· 搜索DFS/BFS递归、栈、队列、方向数组、剪枝· 动态规划数组、循环、状态转移· 贪心排序、选择· 数据结构应用set、map、priority_queue· 数学素数筛、快速幂、最大公约数__gcd 或自写总结蓝桥杯 C 编程入门重点在于掌握 STL 的常用容器和算法熟悉输入输出优化养成良好的编码习惯变量命名、代码风格、边界处理。多做历年真题逐步提高。祝你备赛顺利