需要寫一個對向量集進行字典序排序的代碼。
所謂字典序
[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了。趁熱乎記錄一下,後面深鑽一下原因。