You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:24:01