做算法题时,往往需要一些最基础的“编程常识”,可以提高解题效率。本篇博客将常见的C++编程解题知识进行记录。
数据范围
int
。记住一点:int
存储数据绝对值数量级不超过$10^9$,而long long
存储数据绝对值数量级不超过$10^{18}$。INT_MAX
:最大的int
类型整数。INT_MIN
:最小的int
类型整数。
float, double
。记住一点:遇到浮点数,尽量使用double
。string
。
符号常量
宏
#define PI 3.14159
,#define P pair<int, int>
typedef关键字
typedef pair<int, int> P;
,typedef long long LL
memset与fill
memset(array, element, buffer)
,位于头文件<stdio.h>
中,将数组array
中大小为buffer
的区域全部置为同一个元素element
(通常为0或者-1),常见用法为memset(arr, 0, sizeof(arr))
,将数组arr
初始化为全零。
fill(array, element, buffer)
,element
为1,但是执行速度没有memset
快。
结构体初始化
结构体也有自己的构造函数,请注意:
typedef struct s {
string name;
int age;
s(string name, int age): name(name), age(age) {}
} Student;
如果按照上述写法给结构体编写了显式的构造函数,那么就不能不经初始化定义一个结构体了,因为默认的构造函数s() {}
被覆盖。因此,完整的、容错性最好的写法如下。
typedef struct s {
string name;
int age;
s() {} // 显式编写空的构造函数,防止被覆盖
s(string name, int age): name(name), age(age) {}
} Student;
输入输出
常用C++中的输入输出操作符cin
和cout
。
cin
读取缓冲区,直到遇到空白符getline(cin, str)
,其中str
为string
容器,它读取缓冲区,直到遇到换行符,因此很适合读取一整行的输入cout
将缓冲区输出
行末空格符处理
有些算法题要求控制行末不允许出现空格符,比较坑,因为可能导致格式错误,处理方法也很简单,在循环内部加一个判断分支即可(比较繁琐)。
int i;
for(i=0; i<arr.size(); i++) {
if(i != arr.size()-1) cout<<arr[i]<<" ";
else c
}