在lower_bound上使用lambda

时间:2016-05-13 16:15:58

标签: c++ c++11 lambda

我试图在c ++中的lower_bound上使用lambda。我已经定义了一个struct

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;
}

但是它一直在抛出关于lambda的错误:

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怎么了?

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

lambda语法是正确的,问题是传递给std::lower_bound的第三个参数,它应该是比较vector<Mop>的元素的值,即Mop,而不是int {1}}。

BTW:a.insert(mop,it);应为a.insert(it, mop);