memset()的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。
memset()函数在mem.h头文件中声明,它把数组的起始地址作为其第一个参数,第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。
相信大家 在学图论, 最小生成树,最短路 这一块的 时候 肯定都用过 cstring 头文件中的 memset 函数吧 , 这几天 我 对这个 memset函数 做了 一些 了解 在这里 分享给大家 。
memset 函数使用很简单,特别是对于搜索时候 vis数组的赋值,最小生成树和最短路的used数组也不错。
但是,都知道memset**只能赋**0和-1;
内部机构是通过按位来实现的。
而这次,来讲一下memset赋大值。
我们可以用memset赋 0xkfkfkfkf 的值(k=1,2,3..7) 后面8,9对于int型有些超范围啊
这样,我们可以给一些数组赋值,
在图论中先对 数组内容赋值,要赋一个很大的值,一般用for循环,
这里,我们就可以用memset 来赋值啦~
之前在博客里我也提到过,赋值0x7fffffff(对于int 型来说 0x7fffffff是最大的数)是不能过的,
因为在里面会有加法,两个这么大的数加起来会成为一个负数,从而影响到题目的答案。
所以,赋值要小于0x7fffffff的一半,而恰巧能通过memset来赋值的。
最大的也就是0x3f3f3f3f,所以可以看到有很多人代码中,
最大值一般用0x3f3f3f3f来表示。
其实,memset是按最后面的来填充。
只管后面的两个字符,然后前面的直接就复制过去。
所以 memset( a,0x3f,sizeof(a) ) 效果等同于 memset( a,0x3f3f3f3f,sizeof(a) )
同理对于,0xnf 等同于 0xnfnfnfnf (n=1,2,3….)
但有时候我们要对数组内容进行比较。
在memset的时候 电脑知道给数组赋值成0x3f3f3f3f 但 比较的时候 0x3f != 0x3f3f3f3f
所以,MAX 设置成0x3f3f3f3f。
当然,如果你不在头声明宏定义或者常量,memset也可以直接用0xnf
还有一点,我说的这些仅仅是对于int类型的测试,double什么的,还没有去测试过~。~
嗯,这就是我对memset的一些新认识,希望可以有点帮助!