一文教你熟练掌握C++刷题及其技巧

C++刷题常用函数及技巧

C++常用知识点学习

万能头文件

基本包括了大部分的STL库函数,使用方便快捷

#include<bits/stdc++.h>

循环读入

  while(cin>>n){
    cout<<n<<endl;
  }

求最大和最小值

 int a,b,maxx,minn;
  cin>>a>>b;
  maxx= max(a,b);
  minn = min(a,b);
  cout<<"a和b中最大值为:"<<maxx<<endl<<"a和b中最小值为:"<<minn<<endl;
    return 0;

交换变量值

int a,b,m;
cin>>a>>b;
swap(a,b);
cout<<"a和b交换之后的值为:"<<a<<":"<<b<<endl;

求绝对值

int a,b,m;
cin>>a>>b;
cout<<"a的绝对值为:"<<m<<endl;

查找(这两个函数必须首先要求数列有序)

lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

 int  a[]={1,2,3,4,5};
  cout<<lower_bound(a,a+4,3)-a<<endl;
  cout<<upper_bound(a,a+4,3)-a<<endl;

输入/输出

int n=0;
cin>>n;  //输入n
cout<<n<<endl; //输入n,外加换行

字符串

string s;
string t="m";
cin>>s;//不包括空格
getline(cin,s);//读取一行,可以包含空格
s.append(t);//将字符t添加到s  
cout<<s+t;  //同上述效果一样
//find(“字符串”) / find("字符串",postion)   ---找不到就返回很大很大的数,可以与-1比较
if(s1.find(s2)==-1){
    cout<<"在s1中未找到s2"<<endl;
  }
cout<<s.find(t)<<endl; //找子序列t在s中出现的首次位置
cout<<s.find(t,2)<<endl; //从第二个位置开始找,找子序列t在s中出现的首次位置
int len = s.size();//字符串s的⻓度
int len = s.length();//字符串s的⻓度
cout<<*s1.begin()<<endl;//指向字符串的第一个元素
cout<<*(s1.end()-1)<<endl;//指向字符串的最后一个元素
reverse(s.begin(), s.end());//字符串反转
string s1 = "hello";
string sTemp=s1.substr(1);//下标1开始到结束
//截取substr(pos,num) ----在哪个位置截取,截取多少字符
string sTemp2 = s1.substr(1,3);//下标1开始,截取3个字符
cout<<sTemp<<"----"<<sTemp2<<endl;
cout<<s1[0]<<endl; //访问字符串的0处的位置
string s1,s2;
cin>>s1>>s2;
//两个字符串之间的大小关系
 cout<<(s1==s2)<<endl;
 cout<<(s1>s2)<<endl;
 cout<<(s1<s2)<<endl;
//插入insert(position,"字符串")
s1.insert(1,"b");
cout<<s1;
//删除 erase(pos,num)----在哪个位置删除多少字符
s1.earse(1,2);
//将123456转为字符串
s1 = to_string(123456);
cout<<s1;
//将字符型1234转为int类型   ---string to int
int x=stoi("1234");
 cout<<x<<endl;

栈(stack)

  #include<stack>  //要引入库函数
  stack<int> s ;
    for(int i=0;i<6;i++){
        s.push(i);//入栈操作
    }
    cout<<s.top()<<endl;  //访问s的栈顶元素
    cout<<s.size()<<endl;  输出s的元素个数
     s.pop(); // 删除栈顶元素但不返回其值
    cout<<s.empty()<<endl; //非空返回0,是空返回1

队列(普通队列 -----优先队列)

普通队列

#include<queue>//要引入库函数
   queue<int> s ;
    for(int i=0;i<6;i++){
        s.push(i);//将i元素接到队列的末端;
    }
    cout<<"首元素为:"<<s.front()<<endl;  //访问队首元素
    cout<<"队尾元素:"<<s.back()<<endl;  访问队尾元素
     s.pop(); // 弹出队列的第一个元素,并不会返回元素的值;
    cout<<s.empty()<<endl; //非空返回0,是空返回1

优先队列

暂时未看

集合(set)

⼀个set⾥⾯的各元素是各不相同的(重复元素自动删除),⽽且set会按照元素进⾏从⼩到⼤排序

#include<set>
set<int> s;
  s.insert(2);//插入元素

  s.insert(100);//插入元素
  for(int i=0;i<6;i++){
    s.insert(i);//插入元素
  }
//迭代变量set<int>::iterator it
  for(set<int>::iterator it=s.begin();it!=s.end();it++){
    cout << *it << " ";//集合的遍历,it是一个迭代的指针
  }
//方法二:
 for(auto v: s)  cout<<v<<" ";
//输入结果:0 1 2 3 4 5 100
//按照从小到大排序,且删除相同元素

s.erase(3);//删除元素为3的
s.clear();//清空
s.size();//长度
s.empty();//判空
cout<<*s.find(2)<<endl; //查找某一个num值,返回的是迭代器,因此需要*来输出

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

multiset<int> mus;
 mus.insert(1);
 mus.insert(2);
 for(int i=0;i<6;i++){
        mus.insert(i);
  
  }
    for(auto v: mus)  cout<<v<<" ";
//输出结果 0 1 1 2 2 3 4 5

map/字典/映射

map使用方括号直接访问

初次访问的映射自动插入0/默认值

  map<int,int> mp;
  int n;
  cin>>n;
  for(int i=1;i<=n;i++){
    int x;
    cin>>x;
    mp[x] =i;
  }
  for(auto v: mp) cout<<v.first<<" : "<<v.second<<endl;

在这里插入图片描述

在这里插入图片描述

向量(vector)

#include<vector>
vector<int> test;//建立一个vector

test.push_back(1);
test.push_back(2);//把1和2压入vector,这样test[0]就是1,test[1]就是2
cout<<vec[0]<<endl;//使用下标访问元素
//使用迭代器访问元素.
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++){
     cout<<*it<<endl;
}
vec.insert(vec.begin()+i,a);//在第i+1个元素前面插入a;
vec.erase(vec.begin()+2);//删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);//删除区间[i,j-1];区间从0开始
cout<<vec.size()<<endl;//向量大小
vec.clear();//清空

二维的vector

在这里插入图片描述

交流群

QQ群:1098392728

在这里插入图片描述

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

William_Tao(攻城狮)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值