C++ 向boost::graph添加对象

C++ 向boost::graph添加对象,c++,object,boost,graph,initialization,C++,Object,Boost,Graph,Initialization,我正在尝试创建一个需要使用某种遍历算法遍历的对象图。此时此刻,我正试图使用自定义对象创建图形。我试图实现这一目标的方式如下: #include <boost/graph/adjacency_list.hpp> #include <boost/graph/depth_first_search.hpp> #include <iostream> using namespace std; typedef boost::adjacency_list<boost:

我正在尝试创建一个需要使用某种遍历算法遍历的对象图。此时此刻,我正试图使用自定义对象创建图形。我试图实现这一目标的方式如下:

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

using namespace std;
typedef boost::adjacency_list<boost::vecS,boost::vecS,boost::directedS> CustomGraph;
typedef boost::graph_traits<CustomGraph>::vertex_descriptor CustomVertex;

class CustomVisitor:public boost::default_dfs_visitor
{
        public:
                void discover_vertex(CustomVertex v,const CustomGraph& taskGraph) const
                {
                        cerr<<v<<endl;
                        return;
                }


};

class CustomObject{
        private:
                int currentId;
        public:
                CustomObject(int id){
                        currentId = id;
                }

};


int main()
{
        CustomGraph customGraph;
        CustomObject* obj0 = new CustomObject(0);
        CustomObject* obj1 = new CustomObject(1);
        CustomObject* obj2 = new CustomObject(2);
        CustomObject* obj3 = new CustomObject(3);

        typedef std::pair<CustomObject*,CustomObject*> Edge;
        std::vector<Edge> edgeVec;
        edgeVec.push_back(Edge(obj0,obj1));
        edgeVec.push_back(Edge(obj0,obj2));
        edgeVec.push_back(Edge(obj1,obj2));
        edgeVec.push_back(Edge(obj1,obj3));
        customGraph(edgeVec.begin(),edgeVec.end());
        CustomVisitor vis;
        boost::depth_first_search(customGraph,boost::visitor(vis));

        return 0;
}
#包括
#包括
#包括
使用名称空间std;
typedef boost::邻接列表自定义图;
typedef boost::graph_traits::vertex_描述符CustomVertex;
类CustomVisitor:public boost::default\u dfs\u visitor
{
公众:
void discover_顶点(CustomVertex v、常量CustomGraph和taskGraph)常量
{

cerr嗨,我知道这是一个相当古老的问题,但可能还有其他问题可以从答案中受益

似乎您忘记了定义图形将有一个自定义类作为顶点。您必须向typedef添加第四个参数,并为边添加typedef:

typedef boost::adjacency_list<boost::vecS,boost::vecS,boost::directedS, CustomObject> CustomGraph;
typedef boost::graph_traits<CustomGraph>::vertex_descriptor CustomVertex;
typedef boost::graph_traits<CustomGraph>::edge_descriptor CustomEdge;
typedef boost::邻接列表自定义图;
typedef boost::graph_traits::vertex_描述符CustomVertex;
typedef boost::graph_traits::edge_描述符CustomEdge;
然后,我通常在将节点与边连接之前添加节点:

// Create graph and custom obj's
CustomGraph customGraph
CustomObject obj0(0);
CustomObject obj1(1);
CustomObject obj2(2);
CustomObject obj3(3);

// Add custom obj's to the graph 
// (Creating boost vertices)
CustomVertex v0 = boost::add_vertex(obj0, customGraph);
CustomVertex v1 = boost::add_vertex(obj1, customGraph);
CustomVertex v2 = boost::add_vertex(obj2, customGraph);
CustomVertex v3 = boost::add_vertex(obj3, customGraph);

// Add edge
CustomEdge edge; 
bool edgeExists;
// check if edge allready exist (only if you don't want parallel edges)
boost::tie(edge, edgeExists) = boost::edge(v0 , v1, customGraph);
if(!edgeExists)
    boost::add_edge(v0 , v1, customGraph);

// write graph to console
cout << "\n-- graphviz output START --" << endl;
boost::write_graphviz(cout, customGraph);
cout << "\n-- graphviz output END --" << endl;
//创建图形和自定义对象
自定义图形自定义图形
customobjectobj0(0);
自定义对象obj1(1);
自定义对象obj2(2);
自定义对象obj3(3);
//将自定义对象添加到图形中
//(创建增强顶点)
CustomVertex v0=boost::添加_顶点(obj0,customGraph);
CustomVertex v1=boost::添加_顶点(obj1,customGraph);
CustomVertex v2=boost::添加_顶点(obj2,customGraph);
CustomVertex v3=boost::添加_顶点(obj3,customGraph);
//添加边
定制边缘;
布尔边缘主义者;
//检查edge allready是否存在(仅当不需要平行边时)
boost::tie(edge,edgeExists)=boost::edge(v0,v1,customGraph);
如果(!edgeExists)
boost::添加_边(v0、v1、自定义图);
//将图形写入控制台

我没有机会将此标记为答案。感谢您的回复。