C++ lambda syntax
C++ lambda syntax
我的函数搜索迭代器的向量并返回迭代器,如果其名称匹配流经的字符串作为参数。
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
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- AWS Lambda C++运行时权限被拒绝
- 捕获lambda中的std::数组
- 这 4 个 lambda 表达式之间有什么区别?
- 在实现文件中使用头文件的通用 lambda
- C++ lambda syntax