2017-03-21 8 views
0

Mit den beiden folgenden Funktionen, wie könnte ich eine Lambda-Funktion BFS-Traverse durch eine grafische Darstellung der Dings verwenden x genanntC++ Lambda-Funktion für BFS Traversal

i.e. Graph<Thing> x 

, die die Anzeigefunktion der bfsTraverse Funktion beinhaltet das Senden von so dass die Information in jedem Ding angezeigt werden kann.

Also im Grunde muss ich nur verstehen, wie man eine Lambda-Funktion verwendet, um diese hier zusammen zu binden.

Antwort

1

Es ist ziemlich einfach. Zum Beispiel lassen; s Druckwerte von Vektor unter Verwendung von 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; 
} 

letztes Argument [] (...) ist das Lambda. Eine Funktion, die Lambda-Ausdrücke akzeptiert, könnte wie folgt aussehen:

template <typename E, typename FuncType> 
void Graph<E>::bfsTraverse (FuncType func) 
{ 
    /* some code not necessary to describe */ 
} 

UPDATE

Bei einem Diagramm Sie Folgendes tun sollten. Die Implementierung Ihres Graphen sollte eine Methode haben, um auf Vertices zuzugreifen: es kann 'getRoot', 'getSource', 'getAllNodes' sein, es ist die Implementierung definiert. Ich bleibe bei 'getRoot'. Jeder Knoten/Knoten sollte eine Methode haben wie 'getAdjacentVertices', 'getChildren', was auch immer. Kombinieren alle zusammen:

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

Seien Sie sich bewusst, dass ich bewusst die Liste der besuchten Knoten und andere Dinge weglassen. Aber die Idee selbst bleibt gleich. Jetzt können Sie diese Funktion wie folgt aufrufen:

Graph<E> g; 
g.bfsTraverse ([] (const Node& n) { 
        std::cout << n.to_str() << std::endl; 
       } 
);