我剛剛開始學習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)應嚴格基於目標頂點搜索任何匹配,而不管在容器內的邊上施加什麼排序。
任何人都可以闡明我可能做錯或不理解的東西嗎?
你如何設置容器類型?你用'container_traits'創建了自己的容器生成器標籤嗎? – 2012-02-10 20:24:19
編輯顯示容器規格。我想你的意思是container_gen?我沒有在bgl文檔中的任何地方遇到過container_traits。 – kamrann 2012-02-11 05:45:30