gpt4 book ai didi

c++ - BGL 中边的自定义属性

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:27 25 4
gpt4 key购买 nike

我开始使用 BGL 来完成一些与图形相关的任务。我有很多边,每条边都有几个属性,其中之一就是它的权重。 (所有属性都是 float 和整数)。由于我以前从未使用过 BGL(和/或类似的 CPP 库),所以我对所有这些类型、类以及如何正确使用它们有点迷茫。

我这样添加边缘:

struct EdgeProperty
{
int weight;
float e1;
float e2;
};

typedef adjacency_list<vecS, vecS, bidirectionalS, no_property, EdgeProperty> Graph;
...
EdgeProperty prop;
node1 = ...;
node2 = ...;
prop.e1 = ...;
prop.e2 = ...;
prop.weight = ...;

add_edge(node1, node2, prop, g);

然后,我需要稍后访问我的属性(property),我正在尝试这样做:

property_map<Graph, EdgeProperty>::type EdgeWeightMap = get(EdgeProperty, g);
w = get(EdgeWeightMap,some_edge);

但是,这甚至无法编译。它在错误消息中说:

错误:“struct EdgeProperty”中没有名为“kind”的类型

除其他错误外,我现在认为这些错误不太重要。我不知道这是否是您使用自定义属性的方式。您能否向我解释一下 kind 错误消息以及如何使用自定义属性?我找不到关于此主题的任何文档(据我所知)。

最佳答案

看看这段代码,我相信它自己解释了一些事情:

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/properties.hpp>
#include <iostream>

namespace bgl = boost;

struct EdgeInfo
{
int weight;
float e1;
float e2;
};

struct EdgeInfoPropertyTag
{
typedef bgl::edge_property_tag kind;
static std::size_t const num; // ???
};

std::size_t const EdgeInfoPropertyTag::num = (std::size_t)&EdgeInfoPropertyTag::num;

typedef bgl::property<EdgeInfoPropertyTag, EdgeInfo> edge_info_prop_type;
typedef bgl::adjacency_list<bgl::vecS, bgl::vecS, bgl::bidirectionalS,
bgl::no_property, edge_info_prop_type> Graph;
typedef bgl::graph_traits<Graph>::vertex_descriptor vertex_descr_type;
typedef bgl::graph_traits<Graph>::edge_descriptor edge_descr_type;

int
main ()
{
Graph g;
vertex_descr_type u, v;
u = add_vertex (g);
v = add_vertex (g);
EdgeInfo props;
props.weight = 3;
std::pair<edge_descr_type, bool> result = add_edge (u, v, props, g);

EdgeInfo p = get (EdgeInfoPropertyTag (), g, result.first);
std::cout << "weight: " << p.weight << std::endl;
}

您需要阅读 BGL 所基于的概念。

通过这种方式,您可以将任何类型的值卡在边上(对于顶点也是如此)。您还可以使用预定义类型的属性,例如 edge_weight_tedge_name_t 我相信。

另请参阅关于 custom edge properties 的 BGL 文档.

关于c++ - BGL 中边的自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7952656/

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