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我提供了接缝来返回一个布尔值?
当我删除比较器时,代码仍然排序,虽然这种效果不合适,因为索引的排序具有可预测的结果。
答案 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类型的对象可以被解除引用,然后隐式转换为它们。
代码中Type1
和Type2
的类型为pair<size_t, tuple<double,double> >
。