[英]Comparator for std::algorithm::sort?
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> 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 :: pair <_Ty1,_Ty2>'到'size_t'
我很困惑,比較器的形式是什么? 我認為應該返回布爾值的任何東西? 和我提供的lambda接縫返回布爾值?
當我刪除比較器時,代碼仍會進行排序,盡管由於按索引進行排序具有可預期的結果,所以並不需要這種效果。
您正在嘗試對vector< pair<size_t, tuple<double,double> >>
進行排序,因此比較器必須比較pair<size_t, tuple<double,double> >
,而不是size_t
。
只需在gcc-4.9中嘗試一下,即可獲得以下信息:
沒有將參數1從'std :: pair>'轉換為'size_t {aka long unsigned int}'的已知轉換
簡單的結論就是:您的comp不正確,您需要std::pair<size_t, std::tuple<double, double>>
。
比較器應為(如果按索引排序):
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);
});
為此, 排序
comp-比較函數對象(即滿足Compare要求的對象),如果第一個參數小於第二個元素(即在第二個元素之前排序),則返回true。
比較函數的簽名應等效於以下內容:
bool cmp(const Type1&a,const Type2&b);
簽名不需要具有const&,但是函數對象不得修改傳遞給它的對象。 Type1和Type2類型必須使得可以取消引用RandomIt類型的對象,然后將其隱式轉換為它們兩者。
Type1
和Type2
的類型在代碼中為pair<size_t, tuple<double,double> >
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.