Re:memset 賦值
阿新 • • 發佈:2020-08-25
前言
賦值其實用 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\);而像 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(有沒有那個大佬告訴我多維陣列怎麼算位元組數)。 memset(f,a,sizeof f)
只有在 \(a=-1/0\) 時恰好賦值 \(a\);其他值,例如 \(1\),只能使用 for 或 fill。- 如果陣列變數型別為
char
賦值直接是對應字元的 ASCII 碼值;如果是bool
,那麼賦為直接 \(0\) 或者 \(1\) 即可。
最後
如果用 memset 怎麼樣都調不出來,就改成 for 吧。。。