【发布时间】:2018-10-27 15:22:18
【问题描述】:
我正在尝试 Hackerrank 上的问题哈希表:冰淇淋店。这是一个简单的问题,但这是我遇到的奇怪情况。数据结构的变化有什么影响? 案例一:
void whatFlavors(vector<int> cost, int money) {
int ans1,ans2;
vector<int> arr(100,0); //notice this
for(int i=0;i<cost.size();i++){
if(arr[money-cost[i]]!=0){
ans1=i+1;ans2=arr[abs(money-cost[i])];
if(ans1>ans2){
cout<<ans2<<" "<<ans1<<endl;
}else{
cout<<ans2<<" "<<ans1<<endl;
}
break;
}
else{
arr[cost[i]]=i+1;
}
}
}
案例 2: 代码:
void whatFlavors(vector<int> cost, int money) {
int arr[100]={0}; //notice this
int ans1,ans2;
for(int i=0;i<cost.size();i++){
if(arr[money-cost[i]]!=0){
ans1=i+1;ans2=arr[abs(money-cost[i])];
if(ans1>ans2){
cout<<ans2<<" "<<ans1<<endl;
}else{
cout<<ans2<<" "<<ans1<<endl;
}
break;
}
else{
arr[cost[i]]=i+1;
}
}
}
【问题讨论】:
-
最可能的答案是由于缺少边界检查导致数组溢出导致的未定义行为。因为这个问题不符合minimal reproducible example 的所有要求,正如stackoverflow.com help center 中所解释的那样,不太可能有更完整的答案。如果你edit你的问题,删除所有令人讨厌的图像,并用minimal reproducible example补充它,那么也许会有更好的答案。
-
int arr[100]={0};与int arr[100]={};相同。您只是将 0 分配给第一个元素,然后其他元素默认初始化,幸运的是它也是 0。 -
@MatthieuBrucher
int arr[100]={0}和int arr[100]={}都需要用零初始化整个数组。见en.cppreference.com/w/cpp/language/aggregate_initialization -
但方式不同:如果初始化子句的数量小于成员数或者初始化列表完全为空,则剩余成员被值初始化。
-
C 标准中没有术语“值初始化”。目前尚不清楚您的意思是什么。该标准说,其余元素的初始化方式与静态存储持续时间对象的初始化方式相同,也就是说,为零。将某物初始化为零的所有方法都具有相同的效果,即将某物初始化为零。
标签: c++ c++11 data-structures stl