背景:win32+devcpp 5.11
問題:下述代碼在本地devcpp運作無誤,leetcode報錯位址越界
class Solution {
public:
vector<int> num;
vector<int>::iterator it;
vector<vector<int> > minimumAbsDifference(vector<int>& arr) {
vector<vector<int> > mini;
vector<int>::iterator it;
vector<vector<int> >::iterator iter;
sort(arr.begin(),arr.end());//步驟一排序
int t=abs(*(arr.end())-*arr.begin());//t記錄最小內插補點
for(it=arr.begin()+1;it<arr.end();it++){//循環周遊,尋找相鄰差中最小的那個
int k=*(it)-*(it-1);//變量k記錄從第1項開始,後項與前一項的內插補點
if(t>k){
swap(t,k);
}
}
for(it=arr.begin()+1;it<arr.end();it++){//循環周遊,尋找內插補點與記錄下的值相等的元素對
vector<int> vec;
if(t==*(it)-*(it-1)){//找到了元素對
// cout<<*(it-1)<<" "<<*it<<endl;
vec.push_back(*(it-1));
vec.push_back(*(it));
mini.push_back(vec);
}
}
return mini;
}
};
仔細排查發現第十行的int t=*arr.end()-*arr.begin();出錯,arr.end()傳回一個指向最後一個元素後面一位的疊代器,再用*使用該元素,元素不存在,通路越界了。
将其改為:int t=*(arr.end()-1)-*arr.begin();後通過LeetCode檢測。
深入一步:為啥devcpp中沒有檢測出這個bug?