如何在Boost Graph中直接遍历顶点绑定的bundled properties?
BGL原生没有提供直接遍历顶点捆绑属性的迭代器,但可以通过范围适配器快速实现你要的遍历效果。
方法1:C++20及以上版本(使用标准库范围适配器)
直接用std::views::transform把顶点描述符范围转换成属性引用范围,代码如下:
#include <ranges> // g是你实例化后的graph<City>对象 auto city_range = boost::make_iterator_range(vertices(g)) | std::views::transform([&g](auto vd) -> decltype(auto) { return g[vd]; }); // 直接遍历City属性 for (auto& city : city_range) { // 直接操作city对象,比如city.name = "Beijing"; }
注意lambda返回值用decltype(auto)是为了保证返回的是原属性的左值引用,避免产生不必要的拷贝,同时支持修改图内的属性值。
方法2:兼容旧C++标准(使用Boost.Range适配器)
如果你的项目使用C++11/14/17,可以用Boost自带的transform适配器实现同样效果:
#include <boost/range/adaptor/transformed.hpp> auto get_property = [&g](typename graph<City>::vertex_descriptor vd) -> decltype(auto) { return g[vd]; }; auto city_range = boost::make_iterator_range(vertices(g)) | boost::adaptors::transformed(get_property); for (auto& city : city_range) { // 操作city对象 }
工具函数封装
如果你经常需要这个功能,可以封装成通用工具函数,后续直接调用即可:
template <typename Graph> auto all_vertex_bundles(Graph& g) { return boost::make_iterator_range(vertices(g)) | std::views::transform([&g](typename Graph::vertex_descriptor vd) -> decltype(auto) { return g[vd]; }); } // 调用示例 for (auto& city : all_vertex_bundles(g)) { // 你的逻辑 }
如果需要遍历边的捆绑属性,只要把上面代码里的vertices(g)换成edges(g)即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Elle
相关产品推荐
相关产品推荐

