2014-02-20 47 views
1
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; 
} 

錯誤的樣子:比較器爲std :: algorithm :: sort?

1> C:\ Program Files文件(x86)的\微軟的Visual Studio 11.0 \ VC \包括\算法(3781):錯誤C2664:「布爾sort_indexes :: ::操作 ()(爲size_t,爲size_t)常量:性病::對< _Ty1,_Ty2> '到 '爲size_t'

我很困惑」不能從 轉換參數1',什麼是形式的比較?我認爲它應該是任何返回布爾值的東西?和lambda我提供接縫返回布爾值?

當我刪除比較器的代碼仍然排序,雖然這種效果是不希望的,因爲索引排序有一個可預測的結果。

回答

0

在這裏,sort

排版 - 比較函數對象(即,對象滿足比較的要求),如果第一個參數較少(即在之前命令)第二個元素。

比較功能的簽名應該是等效於以下:

布爾CMP(常量的Type1 &一個,常量類型2 & b)的

簽名不需要具有const &,但函數對象不得修改傳遞給它的對象。 Type1和Type2類型必須能夠使RandomIt類型的對象解除引用並隱式轉換爲它們兩者。

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

5

您正在嘗試對vector< pair<size_t, tuple<double,double> >>進行排序,因此比較器必須比較pair<size_t, tuple<double,double> >而不是size_t

1

簡單嘗試在GCC-4.9,得到以下信息:從 '的std ::對>' 到 '爲size_t {又名長無符號整型}'

爲參數1沒有已知的轉換

簡單的結論:你的補償是不正確的,你需要一個比較std::pair<size_t, std::tuple<double, double>>

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); 
    }); 
相關問題