[英]Boost graph: How to copy the nodes and edges of a graph without copying properties?
I am using boost graph with bundled properties. 我正在使用带有捆绑属性的boost图。 After I build the first reference tree. 在我构建第一个参考树之后。 I would like to have several other trees with the same structure and hierarchy but with different vertex and edge property. 我想有几个其他树具有相同的结构和层次结构,但具有不同的顶点和边缘属性。 I find there is a copy_graph method but don't know how to achieve my purpose using this. 我发现有一个copy_graph方法,但不知道如何使用它实现我的目的。 For example, I first create a reference tree, VertexProperty1
and EdgeProperty1
are bundled properties 例如,我首先创建一个参考树, VertexProperty1
和EdgeProperty1
是捆绑属性
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, VertexProperty1, EdgeProperty1> Graph;
Graph g1;
After some processing, g1 contains some vertices and edges. 经过一些处理后,g1包含一些顶点和边。 Then I would want to have a copied tree with different bundled properties. 然后我想要一个具有不同捆绑属性的复制树。
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, VertexProperty2, EdgeProperty2> Graph2;
copy_graph(g1, g2, ???);
Thanks in advance for any kind help. 在此先感谢任何帮助。 Example code would be preferred. 示例代码将是首选。
If you look at the documentation you can see that the parameters vertex_copy
and edge_copy
are the ones that actually copy the properties. 如果查看文档 ,可以看到参数vertex_copy
和edge_copy
是实际复制属性的参数。 The default value for those parameters copy all the properties in every vertex/edge, you need something that "does nothing" instead: 这些参数的默认值复制每个顶点/边的所有属性,你需要“无所事事”的东西:
struct do_nothing
{
template <typename VertexOrEdge1, typename VertexOrEdge2>
void operator()(const VertexOrEdge1& , VertexOrEdge2& ) const
{
}
};
And then invoke copy_graph
like this: 然后像这样调用copy_graph
:
copy_graph(g1,g2,boost::vertex_copy(do_nothing()).edge_copy(do_nothing()));
#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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.