C++ 用于 BFS 遍历的 lambda 函数

C++ Lambda Function for BFS Traversal

本文关键字:lambda 函数 遍历 用于 BFS C++      更新时间:2023-10-16

使用下面的两个函数,我如何使用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;
                } 
);