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了。趁熱乎記錄一下,後面深鑽一下原因。

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