前言
赋值其实用 for 也是可以的,但是 memset 更快。有人又说 fill 不错,但是 fill 的速度几乎是 memset 的二分之一,而且代码长度也比 memset 长 (其实这个才是主要原因,for 太长了)。
各种类型的 sizeof 的大小
sizeof(short)=2
sizeof(int)=4
sizeof(long long)=8
sizeof(__int128)=16
sizeof(unsigned short)=2
sizeof(unsigned int)=4
sizeof(unsigned long long)=8
sizeof(__uint128_t)=16
sizeof(float)=4
sizeof(double)=8
sizeof(long double)=16
sizeof(char)=1
sizeof(bool)=1
其实不需要记这么多,sizeof(type)
就是每个这种变量类型的字节大小,表示数的时候 (1operatorname{B}) 为 (8) 位,例如 int
范围为 (-2^{31}+1sim 2^{31}-1),加上符号位一共有 (32) 为,所以 sizeof(int)
为 (4);而像 char
、bool
都只需要单一字节,所以他们的 sizeof 为 (1)。
memset 赋值原理
memset 是按字节赋值的,意思就是说把这个数的每一个字节都设置为这个数。例如 memset(f,1,sizeof f)
,那么假设这个数组是 int 型的,则其中每个元素都是 ((00000001000000010000000100000001)_2=(16843009)_{10})。所以说如果你不直接用 sizeof arr
,那么前面还要加上 sizeof(type)
这个系数,因为其实这个值代表的是从起始开始赋值多少个字节。
memset 赋极值
对于整型变量
memset(f,-63/63,sizeof f)
无疑是最佳选择,因为 (127) 是去掉符号位时的最大值,但是如果就赋 (-127/127),那么它的两倍就爆炸了,实用性不高;而赋为 (-63/63),它的两倍就不会爆炸。
对于浮点类型
memset(f,0X43,sizeof f)
为保证进度下的最大值。
memset(f,0Xc0,sizeof f)
为保证精度下的最小值。
注意事项
- memset 赋值是从下标 (0) 开始的。
- 最好算字节数,慎用
sizeof arr
,使用这个多组数据极其容易 TLE;但如果是多维数组,可以使用,但是依旧有可能 TLE(有没有那个大佬告诉我多维数组怎么算字节数),建议使用 for。 memset(f,a,sizeof f)
只有在 (a=-1/0) 时恰好赋值 (a);其他值,例如 (1),只能使用 for 或 fill。- 如果数组变量类型为
char
赋值直接是对应字符的 ASCII 码值;如果是bool
,那么赋为直接 (0) 或者 (1) 即可。
最后
如果用 memset 怎么样都调不出来,就改成 for 吧。。。