3

私は bgl の学習を始めたばかりで、adjacency_list のエッジ リストのコンテナーとしてカスタム順序で std::set を使用しているときに問題に遭遇しました。order_out_edges.cpp の例と同様に、operator< を定義して、エッジのプロパティに基づいてエッジを並べ替えます。ここで boost::edge_unique_ordering はカスタム プロパティ タグです。

template < typename Edge >
struct order_by_unique_order: public std::binary_function< Edge, Edge, bool >
{
    inline bool operator() (const Edge& e1, const Edge& e2) const
    {
        return boost::get(boost::edge_unique_ordering, e1) < boost::get(boost::edge_unique_ordering, e2);
    }
};

struct default_edge_containerS {};

namespace boost
{
    template < class ValueType >
    struct container_gen< default_edge_containerS, ValueType >
    {
        typedef std::set< ValueType, order_by_unique_order< ValueType > > type;
    };
}

一般的には正常に動作していますが、edge(u, v, g) 関数を使用するとイテレータ例外が発生します。これらの呼び出しを回避策に置き換えて、(ソース、ターゲット) によるエッジの要求を回避すると、すべて正常に動作します。

ブーストコードを調べたところ、原因がわかっていると確信しています。何か間違ったことをしているのか、ブーストコードの問題なのか、文書化されていない非互換性なのかはわかりません. この関数は、u のアウト エッジ リスト コンテナーで set::find(StoredEdge(v)) を呼び出します。現在、デフォルトの stored_edge::operator< はターゲット頂点を比較するだけですが、私の場合、カスタム operator< が呼び出されており、検索されている StoredEdge(v) は明らかにデフォルトでプロパティなしで初期化されており、これがおそらく原因です問題。edge(u, v, g) は、コンテナー内のエッジに課されている順序に関係なく、ターゲット頂点に厳密に基づいて一致を検索する必要があるようです。

私が間違っていることや理解していないことに誰かが光を当てることができますか?

4

1 に答える 1

1

タイプ(タイプを使用して埋められる)を取り、次のようなものを使用して、カスタム比較関数を使用して2つの入力StoredEdgeの結果を比較するラッパー比較演算子を作成する必要があるようです。get_target)

template <typename Cmp>
struct target_compare {
  Cmp cmp;
  target_compare(const Cmp& cmp): cmp(cmp) {}
  template <typename SE>
  bool operator()(const SE& a, const SE& b) const {
    return cmp(a.get_target(), b.get_target());
  }
};

次にtarget_compare<order_by_unique_order<Edge> >、で比較タイプとして使用しますset

于 2012-02-13T05:48:16.253 に答える