std :: algorithm :: sort的比较器?

时间:2014-02-20 03:56:13

标签: c++ algorithm

vector< pair<size_t, tuple<double,double> >>
sort_indexes(const vector<tuple<double,double>> &v)
//takes a list and prepends the sorted inxdex
{
    // Copy data
    vector< pair<size_t, tuple<double,double> >> idx(v.size());
    for (size_t i = 0; i != idx.size(); ++i)
    {
        idx[i].first=i ;
        idx[i].second=v[i];
    }
    sort(idx.begin(), idx.end(),
        [&v](size_t i1, size_t i2) {return get<0>(v[i1]) < get<0>(v[i2]);}
        );
    return idx;
}

错误如下:

  

1&gt; C:\ Program Files(x86)\ Microsoft Visual Studio   11.0 \ VC \ include \ algorithm(3781):错误C2664:'bool sort_indexes :::: operator   ()(size_t,size_t)const':无法转换参数1   '的std ::对&LT; _Ty1,_Ty2&GT;'到'size_t'

我很困惑,比较器的形式是什么?我认为它应该是返回布尔值的任何东西?和lambda我提供了接缝来返回一个布尔值?

当我删除比较器时,代码仍然排序,虽然这种效果不合适,因为索引的排序具有可预测的结果。

4 个答案:

答案 0 :(得分:5)

您正在尝试对vector< pair<size_t, tuple<double,double> >>进行排序,因此比较器必须比较pair<size_t, tuple<double,double> >,而不是size_t

答案 1 :(得分:1)

在gcc-4.9中简单试试,得到以下信息:

  

“std :: pair&gt;”中没有已知的参数1转换到'size_t {aka long unsigned int}'

简单的结论:你的comp不正确,你需要一个std::pair<size_t, std::tuple<double, double>>的比较器。

答案 2 :(得分:0)

比较器应该是(如果按索引排序):

typedef pair<size_t, tuple<double,double> > param;

    sort(idx.begin(), idx.end(), [&v](const param &it, const param &jt) {
        return it.first < jt.first;
    });

否则:

typedef pair<size_t, tuple<double,double> > param;

    sort(idx.begin(), idx.end(), [&v](const param &it, const param &jt) {
        return std::get<0>(it.second) < std::get<0>(jt.second);
    });

答案 3 :(得分:0)

在这里,sort

  

comp - 比较函数对象(即满足Compare要求的对象),如果第一个参数少于第二个元素(即在之前排序),则返回true。

比较函数的签名应等同于以下内容:

bool cmp(const Type1&amp; a,const Type2&amp; b);

签名不需要const&amp;,但是函数对象不能修改传递给它的对象。 Type1和Type2类型必须使得RandomIt类型的对象可以被解除引用,然后隐式转换为它们。

代码中Type1Type2的类型为pair<size_t, tuple<double,double> >