2016-05-13 133 views
1

我想在C++的lower_bound上使用lambda。我已經定義了一個結構在lower_bound上使用lambda

struct Mop{ 
    Mop(string n, int a){ 
     name = n; 
     age = a; 
    } 
    string name; 
    int  age; 
    bool operator < (const Mop&a) const { 
     return age < a.age; 
    } 
}; 

,並添加功能

void AddVector(vector<Mop> &a, string n , int aa){ 
    Mop mop(n,aa); 
    auto it = lower_bound(a.begin(), a.end(), aa , [](const Mop &ar, const Mop &br){ return ar < br;}); 
    a.insert(mop,it); 
} 
int main() 
{ 
    vector<Mop> a; 
    AddVector(a,"John",15); 
    AddVector(a,"Swan",10); 
    return 0; 
} 

但它保留關於拉姆達拋出錯誤:

error: no matching function for call to 'lower_bound(std::vector<Mop>::iterator, std::vector<Mop>::iterator, int&, AddVector(std::vector<Mop>&, std::string, int)::__lambda0)' 

我一直在尋找和lambda語法應corect,爲什麼它會不斷拋出錯誤?我試圖加入

ar.age and br.age 

到lambda也沒有工作。

這是什麼錯誤lambda?

+0

您是否包含'algorithm'? – SergeyA

+0

什麼編譯器?一旦你將mop傳遞給lower_bound,並且交換要插入的參數,它就會使用cpp.sh:cpp.sh/3ucf4 wfm我也將lambda拉出到單獨的命名變量中(保持行長度不變)。 –

+1

in'vector :: insert',迭代器先去 –

回答

2

您創建mop對象作爲一個比較關鍵的使用,但您傳遞aa相反,它代表了 「原始」 年齡:

auto it = lower_bound(a.begin(), a.end(), aa , [](const Mop &ar, const Mop &br){ return ar < br;}); 
//          ^^ 
a.insert(mop,it); 
//  ^^^ ^^ 
// Arguments are swapped 

應該

auto it = lower_bound(a.begin(), a.end(), mop, [](const Mop &ar, const Mop &br){ return ar < br;}); 
//          ^^^ 
a.insert(it, mop); 
//  ^^ ^^^ 

Demo.

+0

它會拋出相同的錯誤 – Johnyb

+0

請注意,lambda是多餘的,因爲它會做同樣的事情默認的比較器。這個調用可以是'lower_bound(a.begin(),a.end(),mop);' –

+0

@Johnyb這是一個不同的,但非常相似的錯誤 - 你交換'insert'的參數,它應該是' a.insert(it,mop);'([demo](http://ideone.com/l3S2vc)) – dasblinkenlight

0

lambda語法是正確的,問題是傳遞給std::lower_bound的第三個參數,它應該是比較t vector<Mop>的元素,即Mop,而不是int

BTW:a.insert(mop,it);應該是a.insert(it, mop);