需要写一个对向量集进行字典序排序的代码。
所谓字典序
[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了。趁热乎记录一下,后面深钻一下原因。