我有一个搜索迭代器向量的函数,如果迭代器的名称与作为参数传递的字符串匹配,则返回迭代器。
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)
因此,现在很明显,您正在处理向量的一个元素,而不是向量本身。
首先,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)
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)