对于ACM而言,c++远比c好用的多,因为c++的标准模板库能为比赛节省许多时间。虽然cin/cout在某些方面不如scanf/printf,但瑕不掩瑜,总的来说,c++对于竞赛而言,优大于劣。


万能头文件

1
#include<bits/stdc++.h>

万能头文件中几乎包含了所有常用的头文件,但它的兼容性不敢恭维,或许绝大多数oj都能编译通过,但难保有些漏网之鱼。万能头文件虽然方便,但并不推荐使用,一来它会使我们怠惰,二来有些头文件中内置的变量名会与我们自己定义的变量名重用,导致一些莫名其妙的错误。还是推荐自己写头文件。
c++与c的头文件不同之处在于.h和c,例如:

1
2
3
4
5
6
c:
#include<stdio.h>
#include<math.h>
c++:
#include<cstdio>
#include<cmath>

此外,使用c++还需要加上一条:

1
using namespace std;

命名空间,用来区分相同函数名的不同函数。

最大/小值、交换函数

1
2
3
max(a, b);
min(a, b);
swap(a, b);

它们分别完成了返回两个数中的最大值,返回两个数中的最小值,交换两个值的作用。

数组的初始化

1
2
3
int a[N];
memset(a, a+N, 0);
fill(a, a+N, 0);

特别注意memset是按照字节初始化的,例如初始化为1。
实际上存储到int类型后的值是:
00000001 00000001 00000001 00000001
并非想当然的1。
而c++中的fill函数则可以任意赋值。

数组的排序

1
2
3
int a[10] = {3,1,4,1,5,9,2,6,5,3};
sort(a, a+10);
stable_sort(a, a+10);

排序分为稳定排序和不稳定排序:
在数组中,可能存在多个具有相同的关键字的信息,若经过排序,这些信息相对次序不变,则称为稳定排序,反之则称为不稳定排序。
在sort函数中,可以增加第三个比较函数来自定义比较优先级,大体上分为三种写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//1:内置函数
sort(a, a+10, less<int>());//从小到大排序
sort(a, a+10, greater<int>());//从大到小排序
//2:声明一个比较函数
//从小到大排序
bool cmp(int a, int b){
return a < b;
}
sort(a, a+10, cmp);
//3:写在结构体内部,重载运算符
//先按照a从小到大排序,若a相同再按照b从小到大排序
//在调用时直接sort(NODE, NODE+N);即可
struct node{
int a, b;
bool operator <(const node &A) const{
if(a != A.a)
return a < A.a;
return b < A.b;
}
};

二分查找

得到一个有序的数组,是一件美妙的事情。
二分查找,能有效利用数组的有序性,查找到我们需要的信息

1
2
3
4
5
6
7
8
9
10
11
int a[10] = {1,1,2,3,3,4,5,5,6,9};
binary_search(a, a+10, 7);
//二分判断该数组内是否出现7,若出现7,则返回true,反之则返回false
lower_bound(a, a+10, 3);
/*
*二分查找第一个大于等于3的位置
*该函数返回的是一个指针,要想获得下标可以用lower_bound(a, a+10, 3)-a
*/
upper_bound(a, a+10, 3);
//二分查找大于3的位置,用法同lower_bound
//特别的,若是所有元素都小于查找的元素,则返回一个越界的位置N(此处N=10)

Extra

一些自己写就很容易实现的函数

1
2
3
4
max_element(a, a+10);//范围内的最大值的位置
min_element(a, a+10);//范围内的最小值的位置
//引用当前位置的值可写作*max_element(a, a+10);
accumulate(a, a+10, 0);//范围内值的和,第三个变量为初始值