2012-02-07 94 views
3

我剛剛開始學習bgl,並在使用帶有自定義排序的std :: set作爲邊界列表的容器時遇到了問題一個adjacency_list。我定義了運算符<來根據它們的屬性對邊進行排序,就像在ordered_out_edges.cpp示例中一樣。這裏boost :: edge_unique_ordering是一個自定義屬性標記。邊界列表的自定義關聯容器的BGL邊緣(u,v,g)

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

一般來說它工作正常,但我使用邊(u,v,g)函數時出現迭代器異常。如果我將這些調用替換爲避免通過(源,目標)請求邊緣的解決方法,那麼一切正常。

我翻遍了升壓代碼,我很確定我知道原因是什麼,我只是不確定是否意味着我做錯了什麼,這是升壓代碼的問題,或者只是一個無證的問題不兼容。該函數在u的外邊界列表容器上調用set :: find(StoredEdge(v))。現在默認的stored_edge ::運算符<只是比較目標頂點,但在我的情況下,我的自定義運算符<被調用,並且正在查找的StoredEdge(v)顯然是默認初始化的,沒有屬性,這可能是導致問題。在我看來,邊(u,v,g)應嚴格基於目標頂點搜索任何匹配,而不管在容器內的邊上施加什麼排序。

任何人都可以闡明我可能做錯或不理解的東西嗎?

+0

你如何設置容器類型?你用'container_traits'創建了自己的容器生成器標籤嗎? – 2012-02-10 20:24:19

+0

編輯顯示容器規格。我想你的意思是container_gen?我沒有在bgl文檔中的任何地方遇到過container_traits。 – kamrann 2012-02-11 05:45:30

回答

1

看起來你需要編寫一個包裝比較操作使用自定義比較函數,它接受一個類型(將在使用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比較類型。