我有一个搜索迭代器向量的函数,如果迭代器的名称与作为参数传递的字符串匹配,则返回该迭代器。
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主体中引用封闭函数局部变量。
答案 0 :(得分: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;})
所以现在很明显,您正在处理vector的元素,而不是vector本身。
答案 1 :(得分:8)
首先,V->info.name
在lambda内部或外部形成不良。
发送到算法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或更高版本,甚至可以使用通用lambda:
auto found = std::find_if(
V.begin(), V.end(),
[&Name](auto const& item_to_check) {
return Name == item_to_check->info.name;
}
);
答案 2 :(得分:4)
std::find_if
的谓词将依次收到对该范围的每个元素的引用。您需要:
std::find_if(
V.begin(), V.end(),
[&Name](koalaGraph::PVertex const &v) { return Name == v->info.name; }
);
答案 3 :(得分:2)
获取REGEXP_REPLACE()
作为lambda的参数。
V
答案 4 :(得分:1)
Use const auto &
to access the individual elements from your vector in the lambda expression. Since the vector is an lvalue, auto will be deduced to const vector<PVertex> &
. Then, you can use std::distance
to find the element location of the object in the vector.
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;
}
Result is:
found at: V[2]
Example: https://rextester.com/IYNA58046