memset()初始化做题常用的3种情况

1.对于数组初始化为0操作,常用:

memset(a,0,sizeof a); 

替代循环: for(i=0;i<m;i++) a[i]=0; 缩短运行时间。

 

2.将数组初始化为无穷大的情况,例如Floyd算法。

通常对于 32位int有符号数,我们将 无穷大INF 设为 0x3f3f3f3f ,

#define INF 0x3f3f3f3f

为什么不设 INF 为最大值 0x7fffffff (32位int有符号数)呢? 

原因是对于部分问题可能出现 无穷大 加 无穷大 的情况,这样就会出现溢出错误。

所以至多应选择 0x7fffffff 的一半 0x3fffffff,

而 0x3fffffff 和 0x3f3f3f3f 在数量级上是差不多,

都足够大,但将INF设为 0x3f3f3f3f 就可以用 memset 来初始化。

memset(a,0x3f,sizeof a); 

memset 是按字节进行赋值,

能将数组所在的空间全部初始化为 3f3f3f3f3f3f3f3f3f3f3f3f3f...... ,表现出来也就是无穷大了

这样像用Floyd解决的问题,就不必先跑一边O(n^2)去初始化数组。

 

3.类似的,需将数组初始化为-1时,可以用:

memset(a,0xff,sizeof a); 

这种情况也很常见。

初学时,很多猿不理解为什么memset只对初始化 0 和 -1 时有效。

memset(a,0,sizeof a); 

memset(a,-1,sizeof a); 

因为 memset 是按字节赋值,即使给它int类型数,它也是只取该数最低位的一个字节来赋值。

所以 memset 传int型参数来初始化只适用于各个字节都相同的数,这样才能表现出期望的效果,

就像 0x3f3f3f3f 0xffffffff 0x00000000 这种。

 

以上初始化操作对于 64位 long long 有符号数 同样适用。

#define ll_INF 0x3f3f3f3f3f3f3f3f

 

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值