语法糖 / 常见语法错误 汇总
语法糖 / 常见语法错误 汇总
目录
更好的阅读体验戳此进入
关于二维数组作为函数参数
一般意义上有四种写法,这里只记录两种比较常用且直观的:
- 普通数组形式:也是最常见的,因为 C++ 的一些特性,我们不能像一维数组一样直接传一个
int** a
,或者int a[][]
,需要在第二维把长度标注出来,如:
Matrix3(int val[][4]){for(int i = 0; i <= 3; ++i)for(int j = 0; j <= 3; ++j)this->val[i][j] = val[i][j];}
- 变长数组形式:也是比较常用的一种,可以通过传参来限制数组的大小,如:
Matrix3(int height, int width, int val[height][width]){
for(int i = 0; i <= height - 1; ++i)for(int j = 0; j <= width - 1; ++j)
this->val[i][j] = val[i][j];
}
当然这里调用的时候就要把前两个值填上并且防止越界。
关于容器是否支持随机访问
在 C++ 大多数常用容器中支持随机访问的只有 vector
和 deque
,和底层原理有关。
而对于 distance
函数,如果容器本身支持随机访问那么是 $ O(1) $ 的,否则即为 $ O(n) $ 的,所以对于不支持随机访问的容器如 set
,就不能用一般的 lower_bound
方式和 set
进行离散化,否则复杂度会大幅退化。
关于C++的gdb中更好的打印
可以使用如下指令:
set print pretty on
这样之后 p
指令就会让数组换行打印。
关于lower_bound
在使用 lower_bound
和 upper_bound
的时候一定要注意当改为 map
或 set
等的时候一定不要忘记修改为使用成员函数的形式。
同时注意结构体进行 lower_bound
第三个参数,也就是查找值,需要也为该jie'gou'ti
关于一个奇怪的批量赋值多维数组(CE)
曾在网上看到了个很神奇的对多维数组的批量赋初值,大概是这样的:
int t[100][100] = { [0 ... 99][0 ... 99] = 114514 };
这东西的含义就是把整个 $ t $ 数组都赋值为 $ 114514 $。
看着也很奇妙,但是遗憾的是这东西似乎仅在某些特定的编译环境下能用,可能是 VC?我也不确定,至少 NOILinux(或者说 gcc)是用不了。
关于一个高妙的去掉行末空格的写法
printf("%c", " \n"[i == n])
不难想到就是将 string
作为一个数组。
关于在全局初始化类(结构体)中的静态变量
大概就是这样:
class A{
private:
static int a;
}
/*
do something
*/
int A::a = 0;
UPD
update-2023 初稿