竞赛中比较趁手的C++里的函数

1.int to char

sprintf()

int num=456;
char a[5];
sprintf(a , "%d" , int num);
//将num转换成十进制然后逐位存入char型数组a中

%c 整数转成对应的 ASCII 字元
%d 整数转成十进位
%f 倍精确度数字转成浮点数
%o 整数转成八进位
%s 整数转成字符串
%x 整数转成小写十六进位
%X 整数转成大写十六进位

2.char to int

sscsnf()


char a[5] = "123";
int num;
sscanf(a , "%d" , &num);//将char型数组转换成十进制int型num

3.二分法查找

这两个都必须将数组提前按照升序排好,当然降序也行,就是你把4看成大于2还是小于2的事了,说白了就是换个角度,下面的是按照升序来的

(lower_bound(a,a+n,int num)-a):在数组a中找到第一个大于等于num的数字并返回其下标


int a[6] = {1,2,3,4,5,6};
int num = 4;
cout << lower_bound(a,a+6,num)-a << endl;//输出3

(upper_bound(a,a+n,int num)-a):在数组a中找到第一个大于num的数字并返回其下标

int a[6] = {1,2,3,4,5,6};
int num = 4;
cout << upper_bound(a,a+6,num)-a << endl;//输出4

但这两个都是基于二分法查找的,要想准确,就要提前排序!!!

具体例子可以看看蓝桥杯2018年B组递增三元组这道题

4.返回string型输出从第几个到第几个字符

substr(a,b):返回下标从a到b的字符串


string s = "asdfg";
cout << s.substr(1,2) << endl;//此时会输出sd

5.排序

sort(a, a+n,comepare):根据comepare确定数组a是升序还是降序,n是数组长度

bool comepare(int a,int b){
	return a<b;//这样是升序排列,如果改为return a>b,就是降序了
}

int main()
{
    int num[] = {6,8,2,6};
    sort(num,num+4,comepare);
    //如果想要升序排列,可以不用谢comepare,因为升序是默认的

    for(int i=0;i<sizeof(num)/sizeof(num[0]);i++){
    	cout << num[i] << endl;
	}
	return 0;
}

6.得到数组中最大值和最小值

max_element()min_element()
这两个函数用来快速得到数组中的最大/小值最大/小值下标

其中num是定义的数组名,6是数组num的长度,例如:


int num[6]={1,0,5,2,5,0};
cout << *max_element(num,num+6) << endl;
//则此时输出的是num数组的最大值5
int num[6]={1,0,5,2,5,0};
cout << max_element(num,num+6)-num << endl;
//则此时输出的是num数组的最大值的下标2

(注意:无论是max_element()或是min_element(),若数组中最大值为多个相同值时,只按照最先出现的最大值来输出。eg:这里的最大值下标是2而不是4)

min_element()和max_element()的应用方法相同

7.去重函数

unique(data,data+n):将date数组去重,n是数组长度

注意:unique只是能对相邻元素去重,例如:

int main()
{
    int date[6] = {2,3,3,6,2,5};
    int n = unique(date,date+6)-date;
    /*因为unique是将重复的数字放在了最后面
	所以n用来记录没有重复的数字有多少几个*/ 
    for(int i=0;i<n;i++){
    	cout << date[i] << endl;
	}
    //结果是: 2  3  6  2  5
	return 0;
}

这样就只能将相邻的3去重,而不相邻的2就不能实现去重,所以用这个函数之前还需要使用sort()进行排序才行,更重要的是所谓的去重并没有将重复的内容删去,而是把他们都排在了最后面

8.最大公约数和最小公倍数

__gcd:这个函数来求最大公约数,调用一个万能头文件,可以直接用,但有些就用不了,如果用不了参考第二个代码段

//可以直接引用型:
int main()
{
    int gc = __gcd(4,8);
    cout << gc << endl;
    //输出最大公约数4
	return 0;
}
//不可以直接引用型:
int gcd(int a,int b){
    if(b==0) return a;
    else
        return gcd(b,a%b);
}

lcm:这个函数是需要自己定义的,来求最小公倍数


int lcm(int a,int b){
	return a/__gcd(a,b)*b;
}

9.交换函数

swap(a,b):就是将a和b进行交换,不用再有一个中间变量了
注意:a和b是必须是同一类型

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a=3,b=2;
	swap(a,b);
	cout << a  << "  " << b << endl;
	//输出结果为:2  3
	return 0;
}

10.排列组合

next_permutation(): 这是在STL中的,注意要先将数组用sort排个升序

//int型数组:
#include<bits/stdc++.h>
using namespace std;
int main(){
	int num[3] = {5,2,6};
	sort(num,num+3);
	//先使用sort排个序
	do{
		for(int i=0;i<3;i++)
			cout << num[i] << "  ";
		cout << endl;
	}while(next_permutation(num,num+3)); 
}
/*结果展示: 
2  5  6
2  6  5
5  2  6
5  6  2
6  2  5
6  5  2
*/
//string型: 
#include<bits/stdc++.h>
using namespace std;
int main(){
	string s;
	cin >> s ;
	sort(s.begin(),s.end());
	//先使用sort排个序
	do{
		cout << s << endl;
	}while(next_permutation(s.begin(),s.end())); 
}
/*结果展示
hca//输入hca
ach
ahc
cah
cha
hac
hca
*/ 

11. 字符串对比

compare(), strcmp()

string s1="asd", s2="asd";
s1.compare(s2);
/*相等返回0, 大于返回1, 小于返回-1*/
char s1[10]="asd", s2[10]="zxc"
strcmp(s1, s2);
/*相等返回0*/

12. int to string

stringstream实现

/*方一*/
int i=15;
stringstream s1; // 使用输入输出流 头文件要包含#include<sstream>
s1 << x; // 读入数字给流处理
string s = s1.str(); // 转换成string
/*s为转换后的结果*/
/*方二*/
string s = "";
int i = 15;
s += to_string(i); // C++11新增 std::to_string

13. 字符串翻转

reverse() 函数没有返回值

/*数组颠倒顺序*/
#include <algorithm>

int num[3]={ 1, 2, 3 };
reverse( num, num+3 );//3是数组长度
/*数组变成num[3]={ 3, 2, 1 }*/
/*颠倒vactor容器中内容顺序*/
#include <algorithm>

vector<int> v = { 1, 2, 3 };
reverse(v.begin(),v.end());
/*容器变成v = { 3, 2, 1 }*/
/*字符串颠倒顺序*/
#include <algorithm>

string str="asdf";
reverse(str.begin(),str.end());
/*字符串变成str="fdsa"*/

14. 在数组中查找某个值

find 能查到就返回下标地址,找不到返回数组长度
i 的位置=find(开始位置,结束位置+1,i )

#include <algorithm>

int num[] = {1, 2, 3};
int *index;
index = find(num, num+3, 3);//index是查找到3的所在地址
cout << index-num << endl;//用3所在地址减去数组首元素地址就是3的下标
/*这里输出2*/
int num[] = {1, 2, 3};
int *index;
index = find(num, num+3, 5);//找不到返回数组长度所在地址
cout << index-num << endl;
/*这里输出数组长度3*/
/**/

15. 集合set< int >

存进去的元素可以自动升序排序,且去重

#include<set>
#include<iostream>

set<int>::iterator it;//在调用set的元素之前,需要定义迭代器
set<int> s;
s.insert(5);//把5插入进去
s.insert(5);
s.insert(3);
for (it=s.begin();it!=s.end();it++)//输出每个插入的值
    cout<<*it<<endl;
/*
输出:
3
5
*/

//集合s中查找元素i:s.find(i)
//清除s的所有元素:s.clear()
//集合为空  s.empty()==true
//删除一个元素 s.erase()
//集合长度 s.size()
//集合开始的地址 s.begin()
//集合结束的地址 s.end()

/*
在集合s中查找元素i:s.find(i),返回i的地址
若s中不含i,则s.find(i)==s.end()
若s中不含i,则s.find(i)!=s.end()
*/

16. 字符串

字符串长度

string型:s.length(), s.size()
char型:strlen(s)

输入字符串

getline :可接收空格,适用string

string str;
getline(cin,str);

cin :接收一个字符串,string和char一样,遇到“空格”,“TAB”,"回车"都结束

char ch[20];
string s;
cin >> s;
cin >> ch;
cout << ch << endl;
cout << s << endl;
/*asf cjg
cjg
asf*/

getchar() :接受一个字符,可接收空格,回车,只适用于char,常用于吃回车

char ch;
ch = getchar();

cin.get :可接收空格,只适用于char,获取指定数量字符

char ch[20];
cin.get(ch, 11);//获取10个字符
char ch1;
cin.get(ch1);//获取1个字符,相当于ch1 = cin.get()
/**/

cin.getline() :可接收空格,只适用于char,用法和cin.get()差不多,获取指定数量字符

char a[20];
cin.getline(a, 20);

char m[3][20];
for(int i=0;i<3;i++)
	cin.getline(m[i],20);

gets() : 接收一个字符串,可以接收空格,只适用于char

char ch[20];
gets(ch);
  • 8
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值