第三节 竞赛C++入门

  本系列文章是以读者学习过C语言为背景的。C语言是一门很好的语言,但是在算法竞赛中却不是十分流行。举个例子:在2013年的ACM/ICPC世界总决赛中,有1347份代码使用C++提交,323份使用Java提交,但唯独C语言没有人使用。

  在我们参加各类软件竞赛时,C语言的程序代码其实都可以直接作为C++程序来进行编译。C++博大精深,但是也会有很多让人诟病的地方。我们在比赛中,重点只需要利用它其中很少的一部分特性。

C++框架

  虽然C语言的程序可以直接在C++中运行,但是并不是以C++的写法,下面简单地区别一下两种语言。

C:a+b。

1
2
3
4
5
6
7
8
#include<stdio.h>                      
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)==2)
printf("%d\n",a+b);
return 0;
}

C++:返回两个个实数中,较小的一个的绝对值。

1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>                     
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
double a,b;
while(cin>>a>>b) {
cout<<fabs(min(a,b))<<endl;
}
return 0;
}

  首先,和之前我们写的C程序进行比较,在我们使用数学相关的函数时,调用的头文件变成了cmath。实际上math.h依然存在,但是在C++中我们比较推荐使用cmath。类似地,stdio.h变成了cstdio,string.h变成了cstring。

  其次,在我们新增的两个头文件中:iostream提供了输入输出流,而algorithm则提供了一些常用的算法,就比如我们刚刚使用的min()函数。但是,在比赛中建议大家手动编写max和min函数,以免发生意外。

  cin>>a 和 cout<<a 就是我们前面提到的输入输出流,他们就相当于C语言中的scanf和printf函数。相比于后面两个函数,我们在使用输入输出流时省略了%d、%s等占位符。一个是简化了这些繁琐的东西,再一个可以轻易地避免long long 型的输入输出占位符不统一的问题(%i64d、%lld)。但是,C++流是不完美的,其最致命的缺点就是运行太慢,以致于有些题目会在后面明确注明:本题的输入量很大,请不要使用C++的流输入。另外,不要将cout和printf混合使用,会造成输出的数据混乱。

  cin>>a我们还看到了有这一行:using namespace std; 。在C++中,有个概念叫做名称空间。把函数放在名称空间里,我们可以通过这样的方法进行调用:

空间名:函数名();

  cin>>a而我们头文件iostream和algorithm就是放在std 名空间中的。如果我们在写程序的时候,不把std里的名字导入默认空间,那么我们在使用输入输出流的时候就要这么写了:

std:cin>>a;
std:cout<<a;

  C++和C语言的数据类型非常相近,最显著的区别就是多了一个bool类型(ture/false)。

引用

  如果想要在一个函数中去操作主函数中的数值,我们除了可以利用指针之外,C++还给我们提供了引用。相比于指针,引用的功能上比指针要弱,但是减少了出错的可能,还能提高代码的可读性。下面我们来看一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>            
#include<cstdio>
using namespace std;
void swapp(int& a,int& b)
{
int t=a;a=b;b=t;
}
int main()
{
int a=3,b=4;
swapp(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}

  在上面的程序中,我们使用了饮用。在参数的前面加上“&”符号,就表示这个传参是按照传引用的方式进行传递,而不是C语言中的按值传递。这样,在上面的函数内改变参数的值,也会修改到函数的实参。

模板

  在之前,我们可能接触过一些C++给我们提供的函数,比如sort()。默认的函数功能是提供从小到大的排序。如果我们需要从大到小排序,难道需要我们重写sort()吗。

  C++给我们提供了模板功能,可以对一些函数进行修改。

  sort()函数的参数实际上有三个:sort(begin,end,[compare]);第三个是非必填项,意思是排序方式。我们只需要在使用sort函数之前,对它的排序方式进行规定,就可以实现从大到小的排序了。下面是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
bool compare(int a,int b)
{
return a>b;
}
int main()
{
int a[5];
for(int i=0;i<5;i++) {
cin>>a[i];
}
sort(a,a+5,compare);
for(int i=0;i<5;i++) {
cout<<a[i]<<" ";
}
return 0;
}