排序时调试分段错误

时间:2015-10-22 04:44:40

标签: c++11 vector stl

我再次询问细节: https://stackoverflow.com/questions/33265241/reason-of-segmentation-fault-while-sorting?noredirect=1#comment54333476_33265241

这个比较器有什么问题?

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/

enter image description here

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;我问过这个问题,因为排序中有时候不好的比较器会出现分段错误。

0 个答案:

没有答案