如何为std :: sort()编写用户定义的比较

时间:2012-02-19 17:51:23

标签: c++ sorting compare

我有一个二维向量数组vector<vector<int> >,我需要按顺序对其中的向量进行排序。所以......我想我会编写一个比较两个向量然后使用sort()

的函数

然而,我无法理解,然后无法找到适当的语法。这是我的比较功能:

bool vectorcompare (vector<int> v, vector<int> w){ 
    for(int i=0; i<v.size(); i++){
        if(v[i]<w[i]) return 1;
        if(v[i]>w[i]) return 0;
    }
    return 1;
}

然后我调用sort函数,它不起作用:

sort(vector.begin(),vector.end(), vectorcompare());

我做错了什么?

3 个答案:

答案 0 :(得分:12)

首先,编译错误:

sort(vector.begin(),vector.end(), vectorcompare());

vectorcompare是一个函数,而不是类型。也就是说,它不是你可以构建的对象。所以你不要对它();你只需按原样传递函数:

sort(vector.begin(),vector.end(), vectorcompare);

现在,更糟糕的问题是:

bool vectorcompare (vector<int> v, vector<int> w)

const&计算参数,而不是按值计算。 std::vector很大;你不应该不必要地复制它们。

还有一个更糟糕的问题:

for(int i=0; i<v.size(); i++){
    if(v[i]<w[i]) return 1;
    if(v[i]>w[i]) return 0;
}
return 1;

这不构成strict-weak ordering。这提供了小于或等于,这不是严格弱的排序。 std::sort需要根据严格弱的排序进行排序。

答案 1 :(得分:1)

您可能不需要编写自己的比较功能。 std::vector已定义operator<,其执行等效于std::lexicographical_compare。您是否尝试过在std::sort上致电vector<vector>

注意:添加我的评论作为此答案,因为用户发现它有用。

答案 2 :(得分:0)

请查看this site, it has a nice example

在您的情况下,您可以像这样致电std::sort

sort(vector.begin(),vector.end(), vectorcompare);