gpt4 book ai didi

c++ - Boost Graph 通过 vertex_descriptor 访问属性

转载 作者:搜寻专家 更新时间:2023-10-31 02:23:54 25 4
gpt4 key购买 nike

我有自定义的顶点和边属性

namespace boost { 
enum vertex_diagonal_t{vertex_diagonal = 999};
BOOST_INSTALL_PROPERTY(vertex, diagonal);
}
namespace boost {
enum edge_dominance_t{edge_dominance = 998};
BOOST_INSTALL_PROPERTY(edge, dominance);
}

我使用 boost::property 创建我的邻接表

typedef boost::adjacency_list<
boost::listS,
boost::vecS,
boost::bidirectionalS,
boost::property<boost::vertex_diagonal_t, const khut::diagonal*>,
boost::property<boost::edge_dominance_t, float>
> diagonal_dominance_graph;
typedef boost::property_map<diagonal_dominance_graph, boost::vertex_diagonal_t>::type diagonal_map_type;
typedef boost::property_map<diagonal_dominance_graph, boost::edge_dominance_t>::type dominance_map_type;

现在我想遍历我自己的容器并添加顶点

diagonal_dominance_graph graph;
for(storage_type::const_iterator i = repo_begining.begin(); i != repo_begining.end(); ++i){
diagonal_dominance_graph::vertex_descriptor dia_vertex = boost::add_vertex(graph);

//>> ?? HOW CAN I write Properties to dia_vertex HERE ?

//boost::property<boost::vertex_diagonal_t, const khut::diagonal*> p;
//boost::put(p, dia_vertex);

}

我没有得到的是如何通过 vertex_descriptor 设置顶点的属性。可能是我缺少一个简单的功能。

拜托,我不需要任何使 BGL 变得更加复杂的东西,或者在我的示例中清理和重组类型的东西。我只需要知道如何通过 vertex_descriptoredge_descriptor

读取/写入属性

最佳答案

您正在使用属性列表:它们是 documented here .

所以在你的例子中,你会使用

diagonal_map_type  vp = get(boost::vertex_diagonal, graph);

using storage_type = std::vector<int>;
storage_type repo_begining(10);

for(storage_type::const_iterator i = repo_begining.begin(); i != repo_begining.end(); ++i) {
diagonal_dominance_graph::vertex_descriptor dia_vertex = boost::add_vertex(graph);


khut::diagonal* v = nullptr;
boost::put(vp, dia_vertex, v);
}

// likewise for edges
dominance_map_type ep = get(boost::edge_dominance, graph);

查看 Live On Coliru

捆绑属性

同样的文档页面说:

NOTE: The Boost Graph Library supports two interchangeable methods for specifying interior properties: bundled properties and property lists. The former is easier to use and requires less effort, whereas the latter is compatible with older, broken compilers and is backward-compatible with Boost versions prior to 1.32.0. If you absolutely require these compatibility features, read on to learn about property lists. Otherwise, we strongly suggest that you read about the bundled properties mechanism.

10 多年前的 1.32 日期!所以,我建议捆绑属性:

Live On Coliru

#include <boost/graph/adjacency_list.hpp>

namespace khut {
struct diagonal { };

struct MyVertexProperties {
diagonal const* diag_ptr;
};

struct MyEdgeProperties {
float dominance;
};
}

typedef boost::adjacency_list<
boost::listS,
boost::vecS,
boost::bidirectionalS,
khut::MyVertexProperties,
khut::MyEdgeProperties
> diagonal_dominance_graph;

#include <iostream>


int main() {
using namespace boost;

diagonal_dominance_graph g;

khut::diagonal d1, d2;
{
auto v1 = add_vertex(khut::MyVertexProperties { &d1 }, g);
auto v2 = add_vertex(khut::MyVertexProperties { &d2 }, g);

/*auto e1 = */add_edge(v1, v2, khut::MyEdgeProperties { 42.31415926 }, g);
}

for(diagonal_dominance_graph::vertex_descriptor vd : make_iterator_range(vertices(g)))
std::cout << "Is diagonal d1? " << std::boolalpha << (&d1 == g[vd].diag_ptr) << "\n";
for(diagonal_dominance_graph::edge_descriptor ed : make_iterator_range(edges(g)))
std::cout << "Edge dominance: " << g[ed].dominance << "\n";
}

打印

Is diagonal d1? true
Is diagonal d1? false
Edge dominance: 42.3142

关于c++ - Boost Graph 通过 vertex_descriptor 访问属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28740974/

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