1. 程式人生 > 實用技巧 >Re:memset 賦值

Re:memset 賦值

前言

賦值其實用 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) 就是每個這種變數型別的位元組大小,表示數的時候 \(1\operatorname{B}\)\(8\) 位,例如 int 範圍為 \(-2^{31}+1\sim 2^{31}-1\),加上符號位一共有 \(32\) 為,所以 sizeof(int)\(4\);而像 charbool 都只需要單一位元組,所以他們的 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(有沒有那個大佬告訴我多維陣列怎麼算位元組數)。
  • memset(f,a,sizeof f) 只有在 \(a=-1/0\) 時恰好賦值 \(a\);其他值,例如 \(1\),只能使用 for 或 fill。
  • 如果陣列變數型別為 char 賦值直接是對應字元的 ASCII 碼值;如果是 bool,那麼賦為直接 \(0\) 或者 \(1\) 即可。

最後

如果用 memset 怎麼樣都調不出來,就改成 for 吧。。。