C++二维数组排序段错误-之二元关系

需要写一个对向量集进行字典序排序的代码。

所谓字典序

[1 1 2] < [1 1 9] < [2 0 1]

使用vector<vector<float> >存储数据,使用sort(vecs.begin(), vecs.end(), comp)排序,一开始的comp函数是这么写的:

/* 向量字典序比较关系
 * 注意:每个向量的最后一个分量是其ID,故不参与比较
 */
bool comp(const vector<float> &va, const vector<float> &vb){
    int d = va.size()-1;  // 向量最后一位不参与比较           

    for(int i = 0; i < d; i++){   
        if(va[i] < vb[i]){
            return true;
        }else if(va[i] > vb[i]){
            return false;
        }
    }

    return true;
}

结果,向量个数超过一定数目(我的是400000)运行出错了,报段错误,Segmentation fault。小于这个数目就没问题。比较苦恼,一度都不敢用STL了,后来师弟师妹帮指出了错误,叫二元关系

具体就是comp函数中的返回值类型错了,比较函数应该返回二元关系,而不是bool类型,正确代码先贴出来:

/* 向量字典序比较关系
 * 注意:每个向量的最后一个分量是其ID,故不参与比较
 */
bool comp(const vector<float> &va, const vector<float> &vb){
    int d = va.size()-1;           

    for(int i = 0; i < d; i++){   
         if(va[i] < vb[i]){             //返回二元谓词,而不是布尔型
            return va[i] < vb[i];
        }else if(va[i] > vb[i]){
            return va[i] < vb[i];
        }
    }
    return va[d-1] < vb[d-1];
}

果然OK了。趁热乎记录一下,后面深钻一下原因。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章