2020蓝桥杯常用函数和技巧整理

距离蓝桥杯省赛还有三天,开始临时抱佛脚。
文中涉及知识均来自蓝桥杯官方给出的2020年真题解析视频
原视频:http://weike.lanqiao.cn/static/coursehuifang/LNZTC++A/content/%E7%AC%AC%E4%B8%80%E8%8A%822013%E5%B9%B4%E7%9C%81%E8%B5%9B%E7%9C%9F%E9%A2%98%E8%AF%A6%E8%A7%A3.html?courseid=18&dayclassid=1097

1.数字和字符互相转换

用到了sstream库。

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

void i2s(int i, string &str){   //整数转为字符串
    stringstream ss;
    ss<<i;
    ss>>str;
}

void s2i(string str, int &i){   //字符串转为整数
    stringstream ss;
    ss<<str;
    ss>>i;
}

2.STL模板库的常用操作函数

(1)项目实例-vector

#include<bits/stdc++.h>

struct price{   //定义一个结构体,作为容器存储的数据类型
    int a,b,c;
}

vector<price> v1;   //定义两个price容器
vector<price> v2;

int main(){
    string str;
    if(str.find('3')!=string::npos||str.rfind('0')==3){   //sring.find()查找字符,返回一个位
                                                          //置值,若没找到则返回npos; 
                                                          //string.rfind(str)是从字符串右 
                                                          //侧开始匹配str,并返回在字符串中的位置(下标)                                                
        continue;
    }
    else{
        price p={i, int_i, plus);
        v1.push_back(p);   //vector.pushback()把元素插入容器末尾
    }

(2)常用STL标准模板库函数总结

i.迭代器iterator

vector<string>Food;   //定义容器
vector<string>::iterator FoodIter;   //定义迭代器
Food.insert(Food.end(),"----");   //尾插字符串

for(FoodIter=Food.begin();FoodIter!=Food.end();++FoodIter)   //使用迭代器循环显示字符串
{
    cout<<*FoodIter<<endl;
}

ii.push_back()与pop_back()

void PrintLine(string& StringLine)
{
    cout<<StringLine<<endl;
}

list<string> Food;   //定义链表
Food.push_back("---");    //尾插字符串
Food.pop_back();   //删除最后一个元素

for_each(Food.begin(),Food.end(),PrintLine);  //循环显示字符串。for_each()是STL中遍历算法,需要导入algorithm库。第三个参数是自己定义的普通函数作为函数对象。最后结果输出为空

iii.vector


num.insert(num.begin(),99);
//另一种insert()
//void insert(iterator loc, size_type num, const TYPE &val) 指定位置loc前插入num个值为val的元素

for(unsigned i=0;i<num.size();i++)
{
    cout<<num[i]<<endl;
}

num.erase(num.begin());   //删除第一个元素;vector.erase()还有另一种用法:num.erase(iterator start,iterator end)用于删除[start,end)之间的元素

vector<int>::iterator Iter=num.begin();   //定义迭代器
for(Iter=num.begin();Iter!=num.end();Iter++)
{
    cout<<*Iter<<" ";
}
num.insert(Iter,4,5);   //经历一轮循环后迭代器指向尾部,在尾部插入4个5

输出结果为:99 5 5 5 5 

for(i=0;i<num.size();i++){
    cout<<num.at(i)<<endl;   //vector.at()返回指定位置的元素
}
//构造函数

vector<int>num(5,99);   //num容器内容:5个99

vector<int>num1(num);   //拷贝num容器

vector<int>num2(num.begin(), num.end());   //拷贝num容器


//访问vector信息
 
max_size();   //返回vector可以最多容纳元素的数量

size();   //返回当前vector元素的数量
//STL排序函数sort()
sort(num.begin(),num.end());

 

//STL函数count()
int number=count(num.begin(),num.end(),99);   //数num里有几个99

iv.stack

stack<int>mystack;

mystack.push(8);
int temp;

while(!mystack.empty())
{
    temp=mystack.top();   //取栈顶元素(不弹出)
    mystack.pop();   //弹栈
}

v.queue

queue<int>myqueue;

myqueue.push(1);

while(!myqueue.empty()){
    cout<<myqueue.front()<<" ";   //返回队首元素,不出队
    cout<<myqueue.back()<<" ";   //返回队尾元素,不出队
    myqueue.pop();   //队首元素出队
}

vi.priority_queue

特殊队列,每次都是最大的元素在队首。操作与queue类似。

vii.set

元素有序、唯一性。

set<int>S;
S.insert(item);   
S.erase(item);
S.clear();
S.empty();
S.size();
S.find(k);   //返回一个迭代器,指向键值k
S.lower_bound(k);   //~~,指向键值>=k的第一个元素
S.upper_bound(k);   //~~,~~<k的~~

viii.map

map<string,int>s;   //map定义,关键字为string,相同的string只能出现一次

s["Monday"]=1;

(3)sort()函数

bool my_less(int i,int j){ return (i<j);}

vector<int>a={3,7,2,5,4};
sort(a.begin(), a.begin()+4);   //对前四个排序
sort(a.begin(),a.end());   //从小到大排序
sort(a.begin(),a.end(),less<int>());   //从小到大
sort(a.begin(),a.end(),my_less);   //自定义排序
sort(a.begin(),a.end(),greater<int>());   //从大到小

//对结构变量排序
struct Student{
    char name[256];
    int score;
}
bool compare(struct Student* a, struct Student*b){
    return a->score>b->score;
}
vector<struct Student*>stuVec;
sort(stuVec.begin(),stuVec.end(),compare);

//相关函数
stable_sort();   //元素相等时保留原序

(4)字典序排列与比较函数

//基本比较函数
min();
max();
abs();   //绝对值
fabs();   //浮点数绝对值,可用于判断浮点数大小相等:fabs(x-y)<eps,其中,eps为1e-8

//字典序比较
lexicographical_compare(first1,last1,first2,last2,compare);

//返回下一个排序的序列
next_permutation(first,last);

//返回上一个排序的序列
prev_permutation(first,last);

(5)其他

memset(loc,const &var,size);   //初始化例:memset(a, -1, sizeof(a)); a为int数组

3.编程大题对于输入数据的处理

例:拆分一行的单个数据

int line;   //第一行输入行数
cin>>line;
getchar();   //吃掉换行符
int index=0;   //数组下标
for(int i=0;i<line;i++){
    string s;
    getline(cin,s);   //读入一行数据
    istringstream iss(s);   //处理整行文本并化为行内的单个数据,用istringstream封装
    string tmp;
    while(getline(s,tmp,' ')){   //getline(stream,string,delim) 遇到delim裁剪s到tmp
        s2i(tmp,data[index++]);   //字符转数字
    }
}

4.数学相关

i.不定方程ax+by=c,若a、b互质,一定有无穷多解;若c是gcd(a,b)的倍数,一定有无穷多解

ii.闰年判断:x(年号)能被4整除,不能被100整除;或者能被400整除

5.常用算法

i.递归回溯+剪枝(dfs)

int sum =0;

void f(int i,int j,int sum,int cnt){   //递归函数
    if(sum>n/2)    return;   //首先判断出口条件
    if(sum==n/2){
        ans=min(ans,cnt);
        return;
    }
    
    vis[i][j]=1;   //标记为已访问
    //四个分支
    if(i+1<=n-1 && vis[i+1][j]==0)f(i+1,j,sum+g[i][j],cnt+1);
    if(i-1>=0 && vis[i-1][j]==0)f(i-1,j,sum+g[i][j],cnt+1);
    if(j+1<=m-1 && vis[i][j+1]==0)f(i,j+1,sum+g[i][j],cnt+1);
    if(j-1<=0 && vis[i][j-1]==0)f(i,j-1,sum+g[i][j],cnt+1);
    vis[i][j]=0;   //重置为未访问(回溯)
}

int main(){
    ...
    f(0,0,0,0);
    ...
}    

 

  • 12
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值