竞赛--C++速成



提示:以下是本篇文章正文内容,下面案例可供参考

一、小tips(c/c++)

1.scanf与cin的使用

输入与输出的使用细节:cin的速度比scanf要慢不少(即便关了同步),1e5以上的数据使用cin读入可能就会导致TLE;输入建议使用scanf;
scanf(“%s”)可以过滤空格和回车
输出建议使用printf,因为好控制精度;

TLE:Time Limit Exceeded(超时);
cout输出小数(fixed:保存;setprecision:精度; right:右对齐)

  #include <iomanip>
  float n=0.243;
  float k=0.244543;
  cout<<setiosflags(ios::fixed)<<setiosflags(ios::right)<<setprecision(2)<<n<<" "<<k<<endl; 
  //输出右对齐且小数点保留后两位的浮点数。

最后:

//简单理解一下写法
//C语言中,EOF常被作为文件结束的标志,常被用来判断调用一个函数是否成功,EOF(end of file)值通常为-1;
//scanf("%d%d", &a, &b);
//如果a和b都被成功读入,那么scanf的返回值就是2;如果只有a被成功读入,返回值为1;
//如果a和b都未被成功读入,返回值为0;如果遇到错误或遇到end of file,返回值为EOF,且返回值为int型。
while(scanf("%d",&n) != EOF){ 
	cout<<n<<endl;
}
//等价于
while(cin>>n){ 
	cout<<n<<endl;
}

2.构造函数

结构体中可以加入与结构体同名无返回值的构造函数。
在创建结构体时会自动调用该构造函数;

#include <iostream>
using namespace std;
typedef struct node{
	int a;
	node(int A=0){
		a=A;
	}
}Node;
int main()
{
   Node i1= node();  //无输入则输入默认参数 A=0;
   Node i2= Node(3);
   cout<<i1.a<<endl; 
   cout<<i2.a<<endl;
   //i1.a 为 0
   //i2.a 为 3
	return 0;
}

二、常用C++/C标准库

1.引入库–C

常用库–#include <string.h>
memset:将a数组中的值清空/替换
strlen:获取字符串的长度;

#include <stdio.h>
#include <string.h>
int main ()
{
   char str[50];
   int len;

   strcpy(str, "This is");
    memset(str,'x',7);
   len = strlen(str);
   printf("%s 的长度是 %d\n", str, len);
   return(0);
}

/// 运行结果:xxxxxxx的长度是7

库–#include <time.h>
代码运行时间计算:单位(ms)

#include <time.h>
#include <stdio.h>
clock_t star,stop;
double duration;
int a[100];
int n=1;
int x=10;
void myfunction(int a[],int n,int x)
{
	int k;
	k=n+x;
	a[k]=k;
}
int main()
{   
	star=clock();
	for(int i=0;i<6666666;i++)
	{
			myfunction(a,n,x);
	}
	stop=clock();
	duration=((double)(stop-star))/CLK_TCK/6666666;  //为什么函数要运行6666666次
	                                                //因为如果函数运行时间很短那么stop=star(计数器值相同).
													//所以让函数多运行几次然后除以运行次数得一次的时间 
	printf("%.10f\n", duration);    
}
//其实这个用的不多

2.引入库–C++

STL–标准模板库 (Standard Template Library)

1.vector(向量)

向量(vector)是一个能够存放任意类型的大小动态的数组。
向量名.end为得到数组的最后一个单元+1的指针

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> add;
///  vector<int>::iterator p;  指针定义方法
int main()
{

    //在数组的最后添加一个数据 
	for(int i=0;i<100;i++)
	{
		add.push_back(i);
	}
	
	
	//在数组的最后删除一个数据 
	for(int i=0;i<10;i++)
	{
		add.pop_back();
	}
	
	
	add.erase(add.begin(),add.begin()+10);//删除10个add中的数据项 左闭右开 
	
    add.push_back(89); //弄一个重复元素 
    sort(add.begin(), add.end()); //排序
    //sort()的数组的第一个元素的指针,end为指向待sort()的数组的最后一个元素的下一个位置的指针
    
	add.erase(unique(add.begin(), add.end()),add.end());   //去除重复元素 
	//unique(add.begin(), add.end())  将不重复元素排好//返回一个地址该地址为数组的最后一个不重复元素的后一位
		//vector<int>::iterator unique(vector<int> &a) {
		//    int j = 0;
		//    for (int i = 0; i < a.size(); ++i) {
		//        if (!i || a[i] != a[i - 1])//如果是第一个元素或者该元素不等于前一个元素,
		                                     //即不重复元素,我们就把它存到数组前j个元素中
		//            a[j++] = a[i];//每存在一个不同元素,j++
		//    }
		//    return a.begin() + j;//返回的是前j个不重复元素的下标
		//}
	
	//打印数组 
    for (int i=0;i<add.size();i++)
    {
       cout<<add[i]<<" ";
    }
    
    
    // 另一种打印方式 (利用指针) 
    cout<<endl;
    for (vector<int>:: iterator p=add.begin();p!=add.end();p++)
    {
       cout<<*p<<" ";
    }

    return 0;
}

其他:
在这里插入图片描述

2.string

在这里插入图片描述

3.algorithm

sort:sort()函数可以自定义排序准则,以便满足不同的排序情况。使用sort()我们不仅仅可以从大到小排或者从小到大排,还可以按照一定的准则进行排序。比如说我们按照每个数的个位进行从大到小排序,我们就可以根据自己的需求来写一个函数作为排序的准则传入到sort()中

	//从小到大 
    int a[6]={1,2,3,4,5,0};
    sort(a,a+6);
    for(int i=0;i<6;i++)
    cout<<a[i]<<endl;
    cout<<endl;
    
    //从大到小 
    sort(a,a+6,greater<int>());
    for(int i=0;i<6;i++)
    cout<<a[i]<<endl;

   // 按照每个数的个位进行从大到小排序
    bool cmp(int x,int y){
	return x % 10 > y % 10;
    }
    sort(num,num+10,cmp);

在这里插入图片描述
nth_element:将arr.begin()+n位置的数固定,数左边放比他小的数,右边放比他大的;

PS:注意指针的加减
在这里插入图片描述
PS:注意指针的加减(firstLoc lastLoc)
lower_bound:往低位插入数值;
upper_bound:往高位插入数值;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秋刀鱼_(:з」∠)_别急

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

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

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

打赏作者

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

抵扣说明:

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

余额充值