C++ lambda syntax

C++ lambda syntax

本文关键字:syntax lambda C++      更新时间:2023-10-16

我的函数搜索迭代器的向量并返回迭代器,如果其名称匹配流经的字符串作为参数。

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主体中引用封闭功能的本地变量。

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

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

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

发送到algoritm 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或更高,甚至可以使用通用lambdas:

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的谓词将依次收到对范围的每个元素的引用。您需要:

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

V作为lambda的参数获取。

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

使用 const auto &在lambda表达式中访问向量的各个元素。由于矢量是lvalue,因此将将自动推向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]

示例:https://rextester.com/iyna58046