这个比较器有什么问题?
inline bool comp(const vector<int>& a,const vector<int>& b){
for(int i=0;i<a.size() and i<b.size();i++){
if(a[i]<b[i])return 1;
if(a[i]>b[i])return 0;
}
return a.size()<=b.size();
}
我在使用此函数作为比较器方法对vector<vector<int> >
进行排序时遇到分段错误?
编辑:很抱歉提出非详细问题。
这是来自interviewbit的问题陈述
https://www.interviewbit.com/courses/programming/topics/backtracking/problems/comb/
inline bool comp(const vector<int>& a,const vector<int>& b){
for(int i=0;i<a.size() and i<b.size();i++){
if(a[i]<b[i])return 1;
if(a[i]>b[i])return 0;
}
return a.size()<=b.size();
}
vector<vector<int> > Solution::combinationSum(vector<int> &A, int B) {
std::sort(A.begin(), A.end());
A.erase(
std::unique(A.begin(), A.end()),
A.end());
/// T[i] : tells us if target i can be achieved or not.
bool T[B+1];
fill(T,T+B+1,0);
T[0]=1;
for(int i=1;i<=B;i++){
for(int j=0;j<A.size() and !T[i];j++){
if(i-A[j]>=0 and T[i-A[j]]){
T[i]=1;
}
}
}
/// Final answer is r[B];
vector< vector<int> > r[B+1];
r[0].push_back(vector<int>());
for(int i=1;i<=B;i++){
if(T[i]){
for(int j=0;j<A.size();j++){
if(i-A[j]>=0 and T[i-A[j]]){
for(int k=0; k<r[i-A[j]].size() ;k++){
vector<int> d=r[ i-A[j] ][ k ];
d.push_back(A[j]);
r[i].push_back(d);
}
}
}
}
}
for(int i=0;i<r[B].size();i++){
sort(r[B][i].begin(),r[B][i].end());
}
cerr << "comming here " << endl;
sort(r[B].begin(),r[B].end(),comp);
cerr << "not reaching here " << endl;
if(r[B].size()==0)return r[B];
vector< vector<int> > ans(1,r[B][0]);
for(int i=1;i<r[B].size();i++){
if(!comp(r[B][i],r[B][i-1])){
ans.push_back(r[B][i]);
}
}
return ans;
}
此代码为输入
提供了seg错误A : [ 10, 14, 4, 8, 19, 10, 5, 7, 20, 11 ]
B : 31
但是在我的电脑上我工作得很好。
PS :后来我意识到std :: vector有&lt;运算符和&gt;运算符定义,按字典顺序对所有向量进行排序。
sort(r[B].begin(),r[B].end());
现在我想知道为什么在采访平台而不是我的电脑上会出现段错误。
一般问题:由于不良比较功能导致这些分段错误的原因是什么。
对于任何比较函数f,使得f(a,b)和f(b,a)都返回0,在大多数情况下将导致段错误。
堆叠溢出:你们有什么问题,你们不能让我的问题持续几个小时。请在放任何东西之前考虑用户可能会在不久的情况下更新问题。让问题保持至少24小时。我们有些人在晚上睡觉#34;我问过这个问题,因为排序中有时候不好的比较器会出现分段错误。