gpt4 book ai didi

boost - BGL edge(u,v,g),带有用于边缘列表的自定义关联容器

转载 作者:行者123 更新时间:2023-12-02 04:03:07 26 4
gpt4 key购买 nike

我刚刚开始学习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 <只是比较目标顶点,但是在我的情况下,我的自定义运算符<被调用,并且正在寻找的StoredEdge(v)显然没有属性初始化为默认值,这可能是问题。在我看来,edge(u,v,g)应该严格基于目标顶点搜索任何匹配项,而不管对容器内的边缘施加什么排序。

谁能说明我可能做错了什么或没有理解?

最佳答案

看来您需要编写一个包装比较操作符,该操作符需要一个类型(将使用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中的比较类型。

关于boost - BGL edge(u,v,g),带有用于边缘列表的自定义关联容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9169276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com