我刚刚开始学习 bgl,并且在使用具有自定义排序的 std::set 作为 adjacency_list 中边缘列表的容器时遇到了问题。我定义 operator< 以根据边缘的属性对边缘进行排序,就像在 ordered_out_edges.cpp 示例中一样。这里 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) 函数时,我得到了迭代器异常。如果我用解决方法替换这些调用以避免(源,目标)请求边缘,那么一切正常。
我查看了 boost 代码,我很确定我知道原因是什么,我只是不确定这是否意味着我做错了什么,这是 boost 代码的问题,或者只是一个未记录的不兼容性。该函数在 u 的外边列表容器上调用 set::find(StoredEdge(v))。现在默认的 stored_edge::operator< 只是比较目标顶点,但在我的情况下,我的自定义 operator< 被调用,并且正在寻找的 StoredEdge(v) 显然是默认初始化的,没有属性,这可能是导致问题。在我看来, edge(u, v, g) 应该严格根据目标顶点搜索任何匹配项,而不管容器内的边缘采用什么顺序。
任何人都可以阐明我可能做错了什么或不理解吗?