fill函数与编程无穷大

编程中无穷大的设定

很多人可能设为0x7fffffff,这个数的确是32-bit int的最大值,符号位为0,其他的都是1

但在很多情况下,0x7fffffff会出现错误,比如溢出,这样两个无穷大数相加会变成负数,还有如在做dijkstra求最短路时,当做松弛操作,判断if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v]时,若u到v没有路劲,w[u][v]=0x7fffffff,这样d[u]+w[u][v]会变成负数,这就产生了错误。

为了尽量避免以上的错误,我们可以改变无穷大的设定,可以将0x3f3f3f3f设为无穷大,0x3f3f3f3f的10进制表示为1061109567,这个数已达到10^9,足以表示无穷大,又0x3f3f3f3f+0x3f3f3f3f=2122219134,满足无穷大+无穷大仍为无穷大

当把无穷大设为0x3f3f3f3f时,在做初始化时也很方便,比如在初始化数组a时,可以使用

Memset(a,0x3f,sizeof(a)),因为0x3f3f3f3f的每个字节都是0x3f,如果使用0x7fffffff,需要循环赋值,耗费更多时间


memset和fill_n

1.memset是对每个字节赋值,而int有4字节(32位)
比如这样,memset(a,1,sizeof(a));
则a中的每个元素都被赋值成为2进制数为,00000001000000010000000100000001,的数
转换成10进制就是16843009
所以,一般用memset对数组赋0或-1,赋其他的值就要用循环来实现.

 

函数名: memset

//要包含头文件<string.h>
功 能: 设置s中的所有字节为ch, s数组的大小由n给定
用 法: void *memset(void *s, char ch, unsigned n);
程序例:

#include <string.h>
#include <stdio.h>
#include <mem.h>

int main(void)
{
char buffer[] = "Hello world\n";

printf("Buffer before memset: %s\n", buffer);
memset(buffer, '*', strlen(buffer) - 1);
printf("Buffer after memset: %s\n", buffer);
return 0;
}
注意它的用法,不一定是赋为0,其实就是把一个数组的每个单元写上ch,说明了就是写上一个数.

 

 对于对int之类的数组,只能用memset对其初始化为0或-1。

        如:int a[]; memset(a,0,sizeof(a)): //sizof(a)=sizeof(int)*n;

  而对于char型,可以赋任何字符

        如:char a[]; memset(a,'0',sizeof(a));//sizeof(a)=1*n;

 

2,fill_n(void *s,unsigned n,char n)

  //要包含头文件 <iostream>

 与memset的不同不仅在于函数参数的顺序,而且对int型的数组赋值,fil_n可以赋任何值,而memset只能赋0或-1.

memset最快,测试的数据类型的字节越小越有优势,forwhile相差无几,fill最慢,看了下SGI下的fill()的源代码,采用的是for(;first!=last;first++) *first=val;的方式,然后针对char型的是用的memset,我的理解是因为memset对多字节的数据类型不能赋成特定的值,所以才采用的for(),也间接说明了memsetfor应该要快吧。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值