- cin输入整数可以忽略前导零,scanf不可以
'8' - '0'
可以转成数字,int atoi(const char* c)
参数不是char
- double可以用来存1e300次幂的数,整数溢出的一些场合可以使用
max({a, b, c})
可以用来求多个值的最大值,min同理
- 对空的容器调用front(), back()会造成段错误
- 结合-1在内存中的存储方式,
~i
可以用来表示!= -1
memset
,定义在<cstring>
中,按byte填充
memset(a, 0xff, sizeof a);
置-1
memset(a, 0x3f, sizeof a);
置正无穷
- cin之后getline之前的whitespace:
cin >> i >> ws;
,且getline的第二个参数类型是string
- 结构体可以直接赋值,从定义的第一个开始赋值
- 段错误通常为数组越界或者过多的递归导致爆栈
char c[]
可以直接赋值给string,会自动转化,\0
是程序自己加的,赋值的时候也会自己去掉
std::sort()
:可以给线性序列排序,包括builtin数组,需要逆序时可以sort(a.rbegin(), a.rend());
,也可以sort(a.begin(), a.end(), greater<T>());
std::reverse()
也可以用于线性序列和builtin数组
<cstdio>
不能直接操作string,对于输入:char c[]; scanf("%s", c);
,对于输出:printf("%s\n", s.c_str());
,c_str()
定义在<string>
中
- 创建一个
string
:string(n, 'a');
,调用的构造函数std::string( size_type n, char c);
,string(n, "a");
是错的
scanf("%d %c %d", &addr, &data, &next);
,当addr和data都用数字表示从而scanf不能区分时应当用空格分开
- 可以用
st[]
来进行一些标记,防止重复遍历,或者哪些是有效信息
- 适当多用一个数据结构可以更方便
- 注意
const int N = 100010;
0的位数要准确
- range-based for 也可以用来遍历builtin数组
- 整数除法默认向下取整,需要向上取证可以
(a + b - 1 ) / b
,其中b时除数,a时被除数
end() - 1
对于vector
可以,但是对于红黑树的迭代器不行
- 输出
%
,format string%%
和\%
都是对的
double
的控制格式字符串是lf
<cctype>
中定义了一些关于char的判断函数:isdigit
,isalpha
,isalnum
,isspace
,islower
,isupper
, tolower
, toupper
- 浮点数在机器内存储的是近似值,比较和输出时需要一个调整精度的小数如:
1e-6
puts()
定义在<cstdio>
中
int(a * b)
和(int)a * b
不同,通常应该用后面的
- flood fill的三维和二维
int off[][3] = {
{1, 0, 0},
{-1, 0, 0},
{0, 1, 0},
{0, -1, 0},
{0, 0, 1},
{0, 0, -1},
}
int off[][2] = {
{1, 0},
{-1, 0},
{0, 1},
{0, -1},
}
- append两个vector:
a.insert(a.end(), b.begin(), b.end());
,
- 按行处理输入
input:
1 2 5 54
2 3 6
int i;
string line;
getline(cin, line);
stringstream sin(line);
sin >> i;
- 针对pat:当处理浮点数有一些莫名其妙的问题时,试试
long duoble
,控制格式是Lf
,注意大写
- case double to int永远是向下取整,四舍五入用
round
,定义在<cmath>
中
- C++中红黑树和优先队列默认是小根堆
while(n--){}
循环结束后n是-1
- 错误可能出现在input
- 离散化可以用来节省空间,本质是一种hash
- 尽量不要用auto,除非类型不好书写