语法糖 / 常见语法错误 汇总

语法糖 / 常见语法错误 汇总

更好的阅读体验戳此进入

关于二维数组作为函数参数

一般意义上有四种写法,这里只记录两种比较常用且直观的:

  1. 普通数组形式:也是最常见的,因为 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];}
  1. 变长数组形式:也是比较常用的一种,可以通过传参来限制数组的大小,如:
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++ 大多数常用容器中支持随机访问的只有 vectordeque,和底层原理有关。

而对于 distance 函数,如果容器本身支持随机访问那么是 $ O(1) $ 的,否则即为 $ O(n) $ 的,所以对于不支持随机访问的容器如 set,就不能用一般的 lower_bound 方式和 set 进行离散化,否则复杂度会大幅退化。

关于C++的gdb中更好的打印

可以使用如下指令:

set print pretty on

这样之后 p 指令就会让数组换行打印。

关于lower_bound

在使用 lower_boundupper_bound 的时候一定要注意当改为 mapset 等的时候一定不要忘记修改为使用成员函数的形式。

同时注意结构体进行 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 初稿

posted @ 2023-03-05 12:50  Tsawke  阅读(20)  评论(0编辑  收藏  举报