用于 BFS 遍历的 C++ Lambda 函数
C++ Lambda Function for BFS Traversal
使用下面的两个函数,我如何使用 lambda 函数来 BFS 遍历名为 x 的事物图
i.e. Graph<Thing> x
其中涉及将显示函数发送给bfsTraverse函数,以便显示每个Thing中的信息。
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'。每个 vertex/node 都应该有一个像 '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;
}
);
使用下面的两个函数,我如何使用 lambda 函数来 BFS 遍历名为 x 的事物图
i.e. Graph<Thing> x
其中涉及将显示函数发送给bfsTraverse函数,以便显示每个Thing中的信息。
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'。每个 vertex/node 都应该有一个像 '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;
}
);