gpt4 book ai didi

c++ - boost 图 : How to copy the nodes and edges of a graph without copying properties?

转载 作者:可可西里 更新时间:2023-11-01 18:31:21 26 4
gpt4 key购买 nike

我正在使用带有捆绑属性的 boost 图。在我建立第一棵引用树之后。我想要其他几棵具有相同结构和层次结构但具有不同顶点和边缘属性的树。我发现有一个 copy_graph 方法,但不知道如何使用它来实现我的目的。比如我先创建一个引用树,VertexProperty1EdgeProperty1是bundled properties

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, VertexProperty1, EdgeProperty1> Graph;
Graph g1;

经过一些处理,g1包含了一些顶点和边。然后我想要一个具有不同捆绑属性的复制树。

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, VertexProperty2, EdgeProperty2> Graph2;
copy_graph(g1, g2, ???);

在此先感谢您提供的任何帮助。示例代码将是首选。

最佳答案

如果您查看 documentation您可以看到参数 vertex_copyedge_copy 是实际复制属性的参数。这些参数的默认值复制每个顶点/边缘中的所有属性,您需要一些“什么都不做”的东西:

struct do_nothing
{
template <typename VertexOrEdge1, typename VertexOrEdge2>
void operator()(const VertexOrEdge1& , VertexOrEdge2& ) const
{
}
};

然后像这样调用copy_graph:

copy_graph(g1,g2,boost::vertex_copy(do_nothing()).edge_copy(do_nothing()));

Running on Coliru

#include <iostream>
#include <string>

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/copy.hpp>
#include <boost/graph/graph_utility.hpp>

struct VertexProp1
{
int color;
};

struct VertexProp2
{
std::string name;
};

struct EdgeProp1
{
double weight;
};

struct EdgeProp2
{
std::string name;
};

typedef boost::adjacency_list<boost::vecS,boost::vecS,boost::bidirectionalS,VertexProp1,EdgeProp1> Graph1;
typedef boost::graph_traits<Graph1>::vertex_descriptor VertexDesc;

typedef boost::adjacency_list<boost::vecS,boost::vecS,boost::bidirectionalS,VertexProp2,EdgeProp2> Graph2;

struct do_nothing
{
template <typename VertexOrEdge1, typename VertexOrEdge2>
void operator()(const VertexOrEdge1& , VertexOrEdge2& ) const
{
}
};

void build_graph(Graph1& g)
{
VertexDesc v0=add_vertex(VertexProp1{1},g);
VertexDesc v1=add_vertex(VertexProp1{2},g);
VertexDesc v2=add_vertex(VertexProp1{3},g);
add_edge(v0,v1,EdgeProp1{1.0},g);
add_edge(v1,v2,EdgeProp1{2.0},g);
add_edge(v2,v0,EdgeProp1{3.0},g);

}


int main()
{
Graph1 g1;
build_graph(g1);

std::cout << "Graph1" << std::endl;
print_graph(g1);

Graph2 g2;

copy_graph(g1,g2,boost::vertex_copy(do_nothing()).edge_copy(do_nothing()));

std::cout << "Graph2" << std::endl;
print_graph(g2);

}

关于c++ - boost 图 : How to copy the nodes and edges of a graph without copying properties?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35015550/

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