如果你查看文档,你会发现参数vertex_copy
和edge_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()));
在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);
}