gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:14:39 24 4
gpt4 key购买 nike

使用下面的两个函数,我如何使用 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 打印 vector 的值:

#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;
}
);

关于用于 BFS 遍历的 C++ Lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42917520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com