C ++ lambda语法

问题描述 投票:9回答:5

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

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体中引用封闭函数局部变量。

c++ lambda
5个回答
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;})

所以现在很清楚你正在处理向量的元素,而不是向量本身。


8
投票

首先,V->info.name在lambda的内部或外部形成了病态。

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

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

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

V.end()

4
投票

auto found = std::find_if( V.begin(), V.end(), [&Name](auto const& item_to_check) { return Name == item_to_check->info.name; } ); 的谓词将依次接收对该范围的每个元素的引用。你需要:

std::find_if

2
投票

获取std::find_if( V.begin(), V.end(), [&Name](koalaGraph::PVertex const &v) { return Name == v->info.name; } ); 作为lambda的参数。

V


1
投票

使用std::find_if(V.begin(), V.end(), [&Name](type& V) {return Name == V->info.name;)从lambda表达式中的向量访问各个元素。由于向量是左值,auto将被推导为const auto &。然后,您可以使用const vector<PVertex> &在向量中查找对象的元素位置。

std::distance

结果是:

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

示例:found at: V[2]

© www.soinside.com 2019 - 2024. All rights reserved.