我有一个函数,它搜索迭代器的向量,如果它的名称与作为参数传递的字符串匹配,则返回迭代器。
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的内部或外部形成了病态。
发送到算法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()
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; }
);
作为lambda的参数。
V
使用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]