在日常情况下,我们会经常需要对某些数组或容器进行初始化或清零操作;使用循环进行初始化除了速度一般较慢,还会更加麻烦,这时我们通常使用memset实现。
memset函数
头文件:C语言 string.h
C++cstring
函数定义:
void *memset(void *str, int c, size_t n)
意义:复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
例如,在用memset对某个int类型数组赋值时,由于int有四个字节,则这四个字节中的每个字节都会被赋上指定的值。
由于memset这个对字节赋值的特点,所以memset的使用场景很有限,常见的仅用于赋值0,-1,无穷这三种情况。
例:给数组赋值
int num[100];
memset(num, -1, sizeof num);
int tmp[100][100];
memset(tmp, 0, sizeof tmp);
2024/3/20:
memset能不用就不用,特别是有些题有很多组测试数据,但仔细想想其实没必要每次都初始化的时候,使用了就概率被卡常卡掉(来自TLE后,改了一小时算法最后发现把memset注释掉就过了……)
对变量赋值无穷
在某些情况,例如在图论中就常需要对数组赋值为无穷大,当然这里并不是真正的赋无穷大,而是赋一个很大的数。
通常我们使用十六进制来赋值无穷,主要是由于十六进制写出来较短,而且与二进制转换较好。
对int类型,一般赋值0x3f3f3f3f,即每个字节都赋值为0x3f,来表示正无穷。
实际上我们可以发现,3f并不是单个字节的最大值,int类型的最大值应该是0x7fffffff。这里不使用实际最大值,主要有两点原因。
第一点,就是0x3f3f3f3f的实际大小略大于10^9,而一般题中数据都不会大于这个级别,这个数已经够用。
第二点,就是在一些情况下,无穷与无穷相加,3f可以保证两无穷相加后,结果恰好在int的极限内,不会爆int。
例:给数组赋无穷:
int dist[1000];
memset(dist, 0x3f, sizeof dist);
sizeof
sizeof作用是求出目标数据类型在内存中所占的空间大小,以字节计;sizeof是一个很神奇的东西,它作为一个单目操作符,同时也具体部分函数的使用方法,这里不多解释。
但是在与memset配合对数组进行赋值时,sizeof可以看作一个单目运算符,用来求出数组总长
评论区