使用 Boost::topological_sort 进行拓扑排序

发布于 2024-12-22 13:02:54 字数 2609 浏览 3 评论 0原文

我正在尝试使用 boost 的 topological_sort 函数。

我使用带有 setS 和 listS 的 boost::adjacency_list 作为边和顶点的底层存储。

typedef boost::adjacency_list<boost::setS, boost::listS, boost::bidirectionalS > SizerGraph;  
    SizerGraph sizerGraph;  
    typedef boost::graph_traits<SizerGraph>::vertex_descriptor Vertex;  
    boost::topological_sort(sizerGraph, std::ostream_iterator<Vertex>(std::cout, "\n"));

编译结果出错。 (g++3.4.6)

/usr/include/boost/property_map.hpp:349:错误:不匹配 '((const 中的'运算符+' boost::iterator_property_map<__gnu_cxx::__normal_iterator> >, boost::adj_list_vertex_property_map, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t>, 升压::默认颜色类型, boost::default_color_type&>*)this)->boost::iterator_property_map<__gnu_cxx::__normal_iterator> >, boost::adj_list_vertex_property_map, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t>, boost::default_color_type, boost::default_color_type>::iter + boost::get [与 PropertyMap = boost::adj_list_vertex_property_map, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t>, 参考 = const boost::detail::error_property_not_found&, K = void*](((const boost::put_get_helper, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t>

<块引用>

&)((const boost::put_get_helper, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&,boost::vertex_index_t> *)(((const boost::adj_list_vertex_property_map, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t>*)((const boost::iterator_property_map<__gnu_cxx::__normal_iterator> >, boost::adj_list_vertex_property_map, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t>, boost::default_color_type, boost::default_color_type&>)this)) + 8u))), ((void const&)((void* const*)(&v))))'

/usr/include/boost/graph/detail/adjacency_list.hpp:2264:错误:否 用于调用 `get_property_value(boost::no_property&, boost::vertex_index_t)

但是,使用 vecS 作为顶点的底层存储机制可以实现干净的编译。

我对顶点使用 listS 是否违反了任何概念要求?

I am trying to use topological_sort function of boost.

I am using the boost::adjacency_list with setS and listS as the underlying storage for edges and vertices.

typedef boost::adjacency_list<boost::setS, boost::listS, boost::bidirectionalS > SizerGraph;  
    SizerGraph sizerGraph;  
    typedef boost::graph_traits<SizerGraph>::vertex_descriptor Vertex;  
    boost::topological_sort(sizerGraph, std::ostream_iterator<Vertex>(std::cout, "\n"));

Compilation results in errors. (g++ 3.4.6)

/usr/include/boost/property_map.hpp:349: error: no match for
'operator+' in '((const
boost::iterator_property_map<__gnu_cxx::__normal_iterator > >,
boost::adj_list_vertex_property_map,
boost::detail::error_property_not_found, const
boost::detail::error_property_not_found&, boost::vertex_index_t>,
boost::default_color_type,
boost::default_color_type&>*)this)->boost::iterator_property_map<__gnu_cxx::__normal_iterator > >,
boost::adj_list_vertex_property_map,
boost::detail::error_property_not_found, const
boost::detail::error_property_not_found&, boost::vertex_index_t>,
boost::default_color_type, boost::default_color_type&>::iter +
boost::get [with PropertyMap =
boost::adj_list_vertex_property_map,
boost::detail::error_property_not_found, const
boost::detail::error_property_not_found&, boost::vertex_index_t>,
Reference = const boost::detail::error_property_not_found&, K =
void*](((const boost::put_get_helper,
boost::detail::error_property_not_found, const
boost::detail::error_property_not_found&, boost::vertex_index_t>

&)((const boost::put_get_helper,
boost::detail::error_property_not_found, const
boost::detail::error_property_not_found&, boost::vertex_index_t>
*)(((const boost::adj_list_vertex_property_map,
boost::detail::error_property_not_found, const
boost::detail::error_property_not_found&,
boost::vertex_index_t>*)((const
boost::iterator_property_map<__gnu_cxx::__normal_iterator > >,
boost::adj_list_vertex_property_map,
boost::detail::error_property_not_found, const
boost::detail::error_property_not_found&, boost::vertex_index_t>,
boost::default_color_type, boost::default_color_type&>)this)) +
8u))), ((void
const&)((void* const*)(&v))))'

/usr/include/boost/graph/detail/adjacency_list.hpp:2264: error: no
matching function for call to `get_property_value(boost::no_property&,
boost::vertex_index_t)

However, using vecS as the underlying storage mechanism for vertices results in clean compilation.

Is my usage of listS for vertices breaking any concept requirement?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

温柔嚣张 2024-12-29 13:02:54

这只是一个猜测,但错误消息是这样开始的:

在blah..迭代器中与“operator+”不匹配..

当您使用VecS时,您会得到一个向量 - 其迭代器是随机访问的,并且支持operator+

当您使用ListS时,您会得到一个列表 - 其迭代器是双向的,并且不支持支持运营商+

This is just a guess, but the error message starts out:

No match for 'operator+' in blah .. iterator ..

When you use VecS, you get a vector - whose iterators are random access, and support operator+

When you use ListS, you get a list - whose iterators are bidirectional, and do not support operator+

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文