关于蓝桥杯的一些模板c++
1,c++万能头文件
#include<bits/stdc++.h> //包含所以的常用库
2,关于cin和cout的优化
我们可以知道scanf和printf的速度是快于cin和cout的
是因为cin和cont是需要自行的判断类型,则其速度较慢,
所以我们可以关闭流同步可以提升速度如下
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
3,关于数组开多大?
全局变量:一定要在main函数外面开数组,全局数组在静态存储区,上限很大;如果在main函数里面开大数组,会导致栈溢出(stack overflow);
计算内存:int a[1000000]大约占用4MB,所以开几个10^6的数组没问题,但10^8就会MLE(内存超限)
4,关于long long 的执念
建议在定义变量的时候不用int,改用long long防止溢出
5,关于浮点数精度
如果题目要求要输出小数,请使用double而非float;
6,要优先理解stl容器
1.vector:动态数组:
vector 本质是一个动态数组,相比普通数组:
- 无需预先指定固定大小,可根据需要自动扩容
- 支持随机访问(和数组一样用
[]访问,时间复杂度 O (1)) - 尾部增删元素效率高(O (1)),中间增删效率低(O (n))
初始化的几种常见方式(蓝桥杯高频):
// 1.空vector
vector<int> vec1;
//2.初始化n个元素,每个值为val(默认0)
vector<int> vec2(5) //5个int,值为0;
vector<int> vec3(5,3) //5个int,值都为3;
//3.用已有数组/vector初始化
int arr[] = {1,2,3,4,5};
vector<int> vec4(arr,arr+5); //用数组arr的[0,4]初始化
vector<int> vec5(vec4) //拷贝vec4
//4.c++11初始化
vector<int> vec6 = {1,2,3,4,5};
二、核心操作(蓝桥杯高频)
1. 元素访问
vector<int> vec = {10,20,30,40,50};
//方式1,下标访问(和数组一样)
cout << vec[2] << endl; //输出30;
//方式2,at()访问(有越界检查,更安全)
cout << vec.at(2) << endl; //输出30
//方式3:访问首尾元素(高频)
cout << vec.front()<< endl; //首字母
cout << vec.back() << endl; //尾字母
//4.简化写法
for(auto it :vec){
cout << it << " ";
}
//5.迭代器访问(遍历常用)
for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++){
}
2. 增删元素(蓝桥杯核心)
//1.尾部添加元素(push_back,o(1))
vec.push_back(3); //添加3;
//2.尾部删除元素(pop_back,o(1))
vec.pop_back();
//3.插入元素(insert,o(n),中间插入慎用)
vec.insert(vec.begin() + 1,9);//在索引1的元素插入9
vec.insert(vec.end(),8)//在尾部插入8
//4.删除元素(erase,o(n))
vec.erase(vec.begin()+1);//删除索引1的元素
vec.erase(vec.begin(),vec.end()); //删除所有元素
//5.清空vector(两种方式)
vec.clear(0=); //清空元素,容量不变
vec.resize(0); //清空元素,容量可能变化
3. 容量与大小(必掌握)
vector<int> vec(5,2); //初始化为5个2
//size():元素个数
cout << vec.size() << endl; //输出5;
// capacity():当前容量(分配的内存能容纳的元素数)
cout << vec.capacity() << endl; // 输出5
// empty():判断是否为空(高频)
if(vec.empty()) { cout << "空" << endl; } else { cout << "非空" << endl; }
// resize():调整元素个数
vec.resize(8); // 扩容到8个元素,新增的3个为0
vec.resize(3); // 缩容到3个元素,删除后面的5个
三、蓝桥杯实战技巧
1. 排序(高频考点)
vector 结合 sort 函数是蓝桥杯排序题的标配:
// 升序排序(默认)
sort(vec.begin(), vec.end()); // vec: [1,2,5,5,6,9]
// 降序排序
sort(vec.begin(), vec.end(), greater<int>()); // vec: [9,6,5,5,2,1]
// 自定义排序(比如按绝对值)
sort(vec.begin(), vec.end(), [](int a, int b) { return abs(a) < abs(b); });
2. 去重(高频)
vector<int> vec = {1,2,2,3,3,3,4};
//去除步骤:先排序 ——> 在去重
sort(vec.begin(),vec.end());
// unique把重复元素移到末尾,返回不重复部分的尾迭代器
auto it = unique(vec.begin(), vec.end());
vec.erase(it, vec.end()); // 删除重复部分,vec: [1,2,3,4]
4. 性能优化(蓝桥杯大数据场景)
- 用
reserve()预分配容量,避免频繁扩容(比如已知数据量是 1e5,提前vec.reserve(1e5)) - 尾部操作(
push_back/pop_back)效率远高于中间操作(insert/erase) - 清空时如果需要复用
vector,用vec.clear()比重新定义更高效 - 二维 vector 初始化:
vector<vector<int>> vec(n)是 n 行空 vector,不是 n 行 m 列,需注意 - 容量和大小混淆:
size()是元素个数,capacity()是内存容量,resize()改 size,reserve()改 capacity。
关于set和multiset的用法
set:有序,无重复的集合
multiset:有序,允许重复的集合
共同点:
内部自动排序(默认从小到大)
插入、删除、查找都是 O(log n)
不能像数组那样用 [] 随机访问,必须用迭代
set 最常用操作(竞赛高频)
1. 定义 & 插入
set<int> s;
s.insert(3);
s.insert(1);
s.insert(2);
s.insert(3); // 重复,set 会自动忽略
现在里面是:1 2 3
2. 遍历
for(auto x: s){
cout << x << " ";
}
3.查找元素
auto it = s.find(2);
if(it != s.end(()){
cout << "找到了: " << *it << endl;
4. 删除元素
s.erase(2); // 按值删
s.erase(s.begin()); // 按迭代器删
四、multiset(允许重复)
用法和 set 几乎一模一样,唯一区别:
可以存重复数字。
multiset<int> ms;
ms.insert(2);
ms.insert(2);
ms.insert(3);
里面是:2 2 3
删除注意(超级重要!蓝桥杯常错)
ms.erase(2)→ 删除所有 2ms.erase(ms.find(2))→ 只删一个 2
五、set /multiset 最强功能:找前驱后继
这是它们在蓝桥杯里最值钱的地方!
1. 找 ≥ x 的最小数(lower_bound)
cpp
运行
auto it = s.lower_bound(x); 2. 找 > x 的最小数(upper_bound)
cpp
运行
auto it = s.upper_bound(x); 3. 找最大的数(最后一个元素)
cpp
运行
auto it = s.end(); --it; cout << *it << endl; 4. 找最小的数
cpp
运行
*s.begin()关于map核心特点是「键(key)- 值(value)」成对存储,且键唯一、自动按键升序排序,插入 / 查找 / 删除的时间复杂度都是 O (log n)。在蓝桥杯中,它最适合解决需要「映射关系」的问题,比如统计次数、字符 / 数字映射、缓存数据等。
map 的定义格式:map<键类型, 值类型> 容器名,键和值可以是任意可比较的类型(int、string、char 等):
// 1. 基础定义:int键,int值
map<int,int>mp1;
// 2. 字符串键,int值(统计字符/单词次数高频)
map<string,int> mp2;
// 3. int键,vector值(复杂映射场景)
map<int,vector<int>> mp3;
2. 初始化(蓝桥杯常用方式)
// 方式1:空map,后续插入
map<int, string> mp;
// 方式2:C++11初始化(编译器支持)
map<int, string> mp = {{1, "apple"}, {2, "banana"}, {3, "orange"}};