C ++ Lambda语法

bla*_*eep 9 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];
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我如何将其实现为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;})
Run Code Online (Sandbox Code Playgroud)

但是它说 V

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

Nat*_*ica 20

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

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

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


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

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

因此,现在很明显,您正在处理向量的一个元素,而不是向量本身。


Gui*_*cot 8

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

发送到算法的函数对象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;
    }
);
Run Code Online (Sandbox Code Playgroud)

的类型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;
    }
);
Run Code Online (Sandbox Code Playgroud)

  • `因为矢量不会重载,所以它不会进行类型检查-&gt;`......它不会编译吗?在不重载“ operator-&gt;”类型的对象上使用“-&gt;”是无效的语法 (3认同)
  • @SilvioMayolo您链接给我的答案说,语义是程序的意思,通常是在运行时行为中。我引用的代码格式不正确,还没有语义。也许我不正确地理解这个概念 (2认同)

Que*_*tin 4

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

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