概述
使用场景:数组初始化
使用场景:数组初始化如图论中邻接矩阵
头文件
<string.h>
清零
memset(a,0,sizeof(a))。
无穷大
memset(a,0x3f,sizeof(a))。
负无穷大
memset(a,0xcf,sizeof(a))。0xcfcfcfcf
0x3f3f3f3f为松弛无穷大,区分0x7fffffff
如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择。
很多时候我们并不只是单纯拿无穷大来作比较,而是会运算后再做比较,例如在大部分最短路径算法中都会使用的松弛操作:
if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];
我们知道如果u,v之间没有边,那么w[u][v]=INF,如果我们的INF取0x7fffffff,那么d[u]+w[u][v]会溢出而变成负数,我们的松弛操作便出错了,更一般的说,0x7fffffff不能满足“无穷大加一个有穷的数依然是无穷大”,它变成了一个很小的负数。
除了要满足加上一个常数依然是无穷大之外,我们的常量还应该满足“无穷大加无穷大依然是无穷大”,至少两个无穷大相加不应该出现灾难性的错误,这一点上0x7fffffff依然不能满足我们。
引用自https://blog.csdn.net/tcherry/article/details/37606277
附:最短路径代码(有向图,无向图)
#include<iostream>
using namespace std;
#include<stdio.h>
#include<string.h>
int N;
//边多的时候用领接矩阵
int g[15][15];
bool s[15];//是否在集合中
int d[15];//计算每个顶点的特殊路径长度
int source;
const int INF = 0x3f3f3f;//32位 有符号位 0111 1111 0x3f3f3f3f 防止溢出
//快速按字节赋值 0x3f 3f 3f 3f,无需遍历 0011 1111 dist[i]
= 0x3f3f3f3f
void dijkstra(){
for(int i = 1;i<=N;i++){
s[i] = false;
d[i] = INF;//最大值
}
//对d[i]初始化
for(int i = 1;i<=N;i++){
d[i] = g[source][i];
}
d[source] = 0;
s[source] = true;
//遍历找到最小顶点
int k = source;
for(int j = 1;j<N;j++){
int t = INF;
for(int i = 1;i<=N;i++){
if(!s[i] && d[i] < t){
k = i;
t = d[i];
}
}
s[k] = true; //更新其他顶点的最短特殊路径
for(int i = 1;i<=N;i++){
if(!s[i] && (d[k] + g[k][i]) < d[i])//两个最大数相加会溢出
d[i] = d[k] + g[k][i];
}
}
}
int main(){
int M;
cin>>N>>M;
int f;
cin>>f;
int i,j;
memset(g,0x3f,sizeof(g));
if(f == 1){
for(int k = 1;k<=M;k++){
cin>>i>>j;
cin>>g[i][j];
}
}
else if(f == 0){
for(int k = 1;k<=M;k++){
cin>>i>>j;
cin>>g[i][j];
g[j][i] = g[i][j];
}
}
cin>>source;
dijkstra();
for(int i = 1;i<=N;i++){
if(d[i] == 0x3f3f3f3f && i != source)
cout<<source<<"->"<<i<<":"<<"no path";
else
cout<<source<<"->"<<i<<":"<<d[i];
if(i != N )
cout<<"n";
}
return 0;
}
最后
以上就是自然眼神为你收集整理的【c++】memset 数组清零与无穷大初始化使用场景:数组初始化0x3f3f3f3f为松弛无穷大,区分0x7fffffff的全部内容,希望文章能够帮你解决【c++】memset 数组清零与无穷大初始化使用场景:数组初始化0x3f3f3f3f为松弛无穷大,区分0x7fffffff所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复