C++常用操作及模板

记录了c++编程时常用的操作及模板,建议熟记,在刷题或比赛时有很大帮助

一、字符(串)读入

1)gets()。!!!!!!!字符数组!!!!!。
	用于从标准输入流stdin读入一个整行(以'\n'或EOF)结束,写入ptr指向的字符数组,并返回这个指针;出错或遇到文件结束时则返回NULL。行末的'\n'从流中取出,但不写入数组。gets()不检查被写入的数组大小。
2)getchar()。单个字符。
	用于从标准输入流stdin读入一个字符,并返回这个字符。如果读到文件结尾,则返回EOF。注意到EOF不能用char类型表示,所以getchar()函数返回的是一个int型的数。使用时也应该注意这一点。
3)getline(cin,st)。!!!!!!!字符串!!!!!!。
	st为一个字符串。此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。
	–从输入流中读入字符,存到string变量
	–直到出现以下情况为止:
	•读入了文件结束标志
	•读到一个新行
	•达到字符串的最大长度
	–如果getline没有读入字符,将返回false,可用于判断文件是否结束
4) cin。遇到回车与空格结束读取。

二、常见Ascill码

  • A的ASCII代码为65
  • a的ASCII代码为97
  • 0(数字零)的ASCII代码为48

三、in&out

1、文件输入输出
  freopen("xxx.in","r",stdin);
  freopen("xxx.out","w",stdout);
  ...
  fclose(stdin);fclose(stdout);
2、输入到行末、文末
	1)输入n行,每行数量不定
	 for(int i=1;i<=n;i++){
 	     char c=' ';
 		 while(c!='\n'){
		     cin>>a[tot++];
   	        c=getchar();
   	     }
	 }
	 
 	2)到文件结束
 	while (scanf("%d%d",&a,&b) != EOF)// 一律用这种写法,把你的scanf函数写成这样子,除了return 0之外,其他的语句都要用大括号括起来 

四、快速排序

//情况一:数组排列
int A[100];
bool cmp1(int a,int b)//int为数组数据类型
{
    return a>b;//降序排列
    //return a<b;//默认的升序排列
}
sort(A,A+100,cmp1);
//情况二:结构体排序
Student Stu[100];
bool cmp2(Student a,Student b)
{
    return a.id>b.id;//按照学号降序排列
    //return a.id<b.id;//按照学号升序排列
}
sort(Stu,Stu+100,cmp2);
//情况三:字符串排序
string s[3];
s[0] = "wu";s[1]="jia";s[2]="jun";
bool cmp(string a,string b)
{
    return a < b; //按字典序从小到大排列 
} 
sort(s,s+3,cmp);
//情况四:字符数组排序
char name[3][4] = {"wu","jia","jun"};//二维数组保存n个字符串 
int arr[3] = {0,1,2};//与字符串数组下标一一对应 
bool cmp(int a,int b)
{
    return strcmp(name[a],name[b]) < 0;
}
sort(arr,arr+3,cmp);//排列的实际是标号 ,这么做更快 
for(int i = 0;i <3 ;i++)  printf("%s ",name[arr[i]]);

五、STL堆

https://blog.csdn.net/c20182030/article/details/70757660

https://www.cnblogs.com/lyp-Bird/p/10295305.html

六、读入优化

各种读入方式的速度

int read(){
	    int x=0,p=getchar();
	    while (p>'9'||p<'0') p=getchar();
	    while (p<='9'&&p>='0') x=x*10+p-'0',p=getchar();
	    return x;
	}

七、快速幂

long long quick_pow(long long a,long long b,long long k){//a^b mod k
	long long ans=1,x=a,y=b;
	while (y!=0){
		if (y&1==1) ans=(ans*x)%k;
		x=(x*x)%k;
		y>>=1;
	}
	return ans;	
}

八、二分查找

l=0,r=maxn;
while(l<=r){
	m=(l+r)/2;
	if  (check(m))  l=m+1;
	else  r=m-1;
}
最小值最大(满足条件的最大值)————>cout<<l-1(or r);

l=0,r=maxn;
while(l<=r){
	m=(l+r)/2;
	if  (check(m)) r=m-1;
	else  l=m+1;
}
最大值最小(满足条件的最小值)————>cout<<r+1(or l);

九、memset

memset(a, 0, sizeof(a));//数组中的所有元素全为0
memset(a, -1, sizeof(a));//数组中的所有元素全为-1
memset(a, 127, sizeof(a));//数组中的所有元素全为2139062143

十、unique去重

unique的作用是“去掉”容器中相邻元素的重复元素,这里去掉要加一个引号,为什么呢,是因为它实质上是一个伪去除,它会把重复的元素添加到容器末尾,而返回值是去重之后的尾地址(是地址!!),举个例子:

int num[10]={1,1,2,2,2,3,4,5,5,5};
int ans=unique(num,num+10)-num;

这时,返回的ans是5,而num中前5项就是1,2,3,4,5,一般使用前需要对容器进行排序,这样才能实现对整个数组去重。

sort(t+1,t+n+1);
len=unique(t+1,t+1+n)-t-1;

十一、树状数组

https://www.luogu.org/problemnew/solution/P3368
https://www.cnblogs.com/xenny/p/9739600.html

1、实现单点修改&区间查询
2、实现区间修改&单点查询(差分)

十二、isringstream

一个比较有用的c++的输入输出控制类。
C++引入了ostringstream、istringstream、stringstream这三个类,
要使用他们创建对象就必须包含这个头文件。
istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C风格的串流的输出操作。
strstream类同时可以支持C风格的串流的输入输出操作。
istringstream的构造函数原形如下:
istringstream::istringstream(string str);
它的作用是从string对象str中读取字符。

#include<iostream>  
#include<sstream>        //istringstream 必须包含这个头文件
#include<string>  
using namespace std;  
int main()  
{  
    string str="i an a boy";  
    istringstream is(str);  
    string s;  
    while(is>>s)  
    {  
        cout<<s<<endl;  
    }  

} 
输出是:
i
am
a
boy
posted @ 2021-11-07 23:07  MuscleKKK  阅读(78)  评论(0)    收藏  举报