C++ Boost

EventVisitorList Concept

EventVisitorList は、EventVisitor そのものか、 std::pair で結合された EventVisitor のリストである。各グラフアルゴリズムには、 EventVisitorList を、アルゴリズムに必要な独自のビジタに変換するアダプタが定義されている。 以下に、イベントビジタを std::pair で結合してリストにする方法の例と、アルゴリズムのビジタアダプタクラスの使い方の例を示す。

仮に、深さ優先探索で、各頂点の発見/呼び出しの前後関係を、括弧を使った構造で出力したいとする。これを達成するには、 BGL アルゴリズム depth_first_search() と 2 つのイベントビジタを使えばよい。以下の例の完全なソースコードは examples/dfs_parenthesis.cpp に有る。まず、 2 つのイベントビジタを定義する。使うイベントビジタとして、 DFSVisitor に詳述されたイベントのリストの中から on_discover_vertexon_finish_vertex を選ぶ。

struct open_paren : public base_visitor<open_paren> {
  typedef on_discover_vertex event_filter;
  template <class Vertex, class Graph>
  void operator()(Vertex v, Graph& G) {
    std::cout << "(" << v;
  }
};
struct close_paren : public base_visitor<close_paren> {
  typedef on_finish_vertex event_filter;
  template <class Vertex, class Graph>
  void operator()(Vertex v, Graph& G) {
    std::cout << v << ")";
  }
};
次に 2 つのイベントビジタオブジェクトを作り、 std::make_pair で作られる std::pair を使って、この 2 つから EventVisitorList を作る。
std::make_pair(open_paren(), close_paren())
次にこのリストを depth_first_search() に渡したい所だが、 depth_first_search() が求めているのは DFSVisitor であって、 EventVisitorList ではない。そこで EventVisitor のリストを DFSVisitor に変換するアダプタ、 dfs_visitor を使う。他のビジタアダプタ同様、 dfs_visitor には make_dfs_visitor() という作成関数が有る。
make_dfs_visitor(std::make_pair(open_paren(), close_paren()))
さあこれで、以下のように、生成されたビジタオブジェクトを depth_first_search() に渡す事ができる。
  // グラフオブジェクト G を作る...

  std::vector<default_color_type> color(num_vertices(G));

  depth_first_search(G, make_dfs_visitor(std::make_pair(open_paren(), close_paren())),
                     color.begin());
3 つ以上のイベントビジタのリストを作りたければ、以下のように std::make_pair をネストして呼び出せばいい。
std::make_pair(visitor1,
  std::make_pair(visitor2,
    ...
    std::make_pair(visitorN-1, visitorN)...));

See Also

EventVisitor, Visitor concepts

Copyright © 2000-2001 Jeremy Siek, Indiana University (jsiek@osl.iu.edu)
Lie-Quan Lee, Indiana University (llee@cs.indiana.edu)
Andrew Lumsdaine, Indiana University (lums@osl.iu.edu)

Japanese Translation Copyright © 2003 Hiroshi Ichikawa
オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」に提供されており、いかなる明示的、暗黙的保証も行わない。また、いかなる目的に対しても、その利用が適していることを関知しない。

このドキュメントの対象: Boost Version 1.29.0
最新版ドキュメント (英語)