簡體   English   中英

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

[英]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類型的對象,然后將其隱式轉換為它們兩者。

Type1Type2的類型在代碼中為pair<size_t, tuple<double,double> >

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM