C++ 用于 BFS 遍历的 lambda 函数
C++ Lambda Function for BFS Traversal
使用下面的两个函数,我如何使用lambda函数来BFS遍历一个名为x的事物图
。i.e. Graph<Thing> x
这涉及将显示函数发送到 bfsTraverse 函数,以便可以显示每个事物中的信息。
void display(const Thing& c)
{
cout<<left<<setw(3)<<c.getKey()<<" "<<left<<setw(2)<<c.getLabel()<<endl;
}
template <typename E>
void Graph<E>::bfsTraverse(FuncType func)
{
/* some code not necessary to describe */
}
所以基本上,我只需要了解如何使用 lambda 函数将它们联系在一起。
这很简单。例如,让我们使用 lambda 打印向量的值:
#include <algorithm>
#include <vector>
#include <iostream>
int main (int argc, char* argv[]) {
std::vector <int> data{1,2,3,4};
std::for_each (data.begin (), data.end (), [] (const int val) { std::cout << val << std::endl;});
return 0;
}
最后一个参数 [] (...( 是 lambda。接受 lambda 的函数可能如下所示:
template <typename E, typename FuncType>
void Graph<E>::bfsTraverse (FuncType func)
{
/* some code not necessary to describe */
}
更新
如果是图表,您应该执行以下操作。图形的实现应该有一个访问顶点的方法:它可能是'getRoot','getSource','getAllNodes',它是定义的实现。我会坚持使用"getRoot"。每个顶点/节点都应该有一个方法,如"getAdjacentVertices","getChildren"等等。组合在一起:
template <typename E, typename FuncType>
void Graph<E>::bfsTraverse (FuncType func)
{
std::queue<Node> q;
auto&& root = getRoot ();
q.push (root);
while (not q.empty ()) {
auto&& current = q.front ();
q.pop ();
func (current);
auto&& adjacent = current.getAdjacent ();
for (auto&& a: adjacent) {
q.push (a);
}
}
请注意,我故意省略了保留访问节点和其他内容的列表。但想法本身保持不变。现在你可以按如下方式调用此函数:
Graph<E> g;
g.bfsTraverse ( [] (const Node& n) {
std::cout << n.to_str () << std::endl;
}
);
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 两组使用lambda函数的大括号
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- C++:Lambda 函数指针转换的用例是什么?
- 将 lambda 函数作为参数传递C++
- 如何将 lambda 函数作为参数发送到另一个函数
- 传递 lambda 函数的权衡是什么?
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- 不是 lambda 函数中的常量表达式
- 如何使用可变参数数重载 lambda 函数?
- 如何通过指针传递lambda函数?
- 使用带有 lambda 函数指针的模板
- openmp c++ 中并行块内 lambda 函数的奇怪行为
- C++ 中 Lambda 函数中的溢出
- 将数组传递到 lambda 函数中
- lambda 函数未显示正确的结果