C ++ Lambda语法

时间:2019-03-19 14:25:40

标签: c++ lambda

我有一个搜索迭代器向量的函数,如果迭代器的名称与作为参数传递的字符串匹配,则返回该迭代器。

koalaGraph::PVertex lookUpByName(std::string Name, std::vector<koalaGraph::PVertex>& Vertices) {

    for (size_t i = 0; i < Vertices.size(); i++) {

        if(Vertices[i]->info.name == Name) 
            return Vertices[i];
    }
}

我的问题是如何将其实现为lambda,以便与std::find_if结合使用?

我正在尝试:

std::vector<koalaGraph::PVertex> V;
std::string Name;
std::find_if(V.begin(), V.end(), [&Name]() {return Name == V->info.name;})

但是它说V

  

除非在捕获列表中,否则不能在lambda主体中引用封闭函数局部变量。

5 个答案:

答案 0 :(得分:20)

find_if将把向量的元素传递到您的lambda中。那意味着你需要

std::find_if(V.begin(), V.end(), [&Name](auto const& V) {return Name == V->info.name;})

因此lambda主体中的V是向量的元素,而不是向量本身。


理想情况下,您要给它起一个不同于V的名称,以便将向量和局部变量分开,例如

std::find_if(V.begin(), V.end(), [&Name](auto const& element) {return Name == elememt->info.name;})

所以现在很明显,您正在处理vector的元素,而不是vector本身。

答案 1 :(得分:8)

首先,V->info.name在lambda内部或外部形成不良。

发送到算法std::find_if的函数对象必须是一元函数。必须将当前元素作为参数进行检查。

auto found = std::find_if(
    V.begin(), V.end(), 
    [&Name](koalaGraph::PVertex const& item_to_check) {
        return Name == item_to_check->info.name;
    }
);

found的类型是对找到的元素的迭代器。如果未找到,则返回V.end()

如果您使用C ++ 14或更高版本,甚至可以使用通用lambda:

auto found = std::find_if(
    V.begin(), V.end(), 
    [&Name](auto const& item_to_check) {
        return Name == item_to_check->info.name;
    }
);

答案 2 :(得分:4)

std::find_if的谓词将依次收到对该范围的每个元素的引用。您需要:

std::find_if(
    V.begin(), V.end(),
    [&Name](koalaGraph::PVertex const &v) { return Name == v->info.name; }
);

答案 3 :(得分:2)

获取REGEXP_REPLACE()作为lambda的参数。

V

答案 4 :(得分:1)

Use const auto & to access the individual elements from your vector in the lambda expression. Since the vector is an lvalue, auto will be deduced to const vector<PVertex> &. Then, you can use std::distance to find the element location of the object in the vector.

struct PVertex
{
    std::string name;
};

int main()
{
    std::vector<PVertex> V = {{"foo"},{"bar"},{"cat"},{"dog"}};

    std::string Name = "cat";

    auto found = std::find_if(std::begin(V), std::end(V), [&Name](const auto &v){return (Name == v.name);});

    std::cout<< "found at: V["<<std::distance(std::begin(V),found)<<"]" <<std::endl;
}

Result is:

found at: V[2]

Example: https://rextester.com/IYNA58046