我正在查看解决方案here,这对我不起作用(但请在===行下阅读以实际查看当前问题)。
我试过了:
boost::undirected_dfs(G, vertex(0,G), boost::visitor(vis));
但我得到
error C2780: 'void boost::undirected_dfs(const Graph &,const boost::bgl_named_params<P,T,R> &)' : expects 2 arguments - 3 provided
error C2780: 'void boost::undirected_dfs(const Graph &,DFSVisitor,VertexColorMap,EdgeColorMap)' : expects 4 arguments - 3 provided
等。我有点得到问题所在(我需要传递一些命名参数,但我认为我的图表中没有任何内容。而且,我不知道与彩色地图有什么关系完全是。
=============================================== ==============================
我的图表已定义:
typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS, boost::no_property, EdgeInfoProperty > Graph;
typedef Graph::edge_descriptor Edge;
typedef Graph::vertex_descriptor Vertex;
我想要的只是做DFS,至少现在。
所以我将其更改为boost::depth_first_search
,似乎有效。
我有(注意const
与void discover_vertex
相比,上面列出的解决方案缺少class MyVisitor : public boost::default_dfs_visitor {
public:
void discover_vertex(Vertex v, const Graph& g) { //note the lack of const
if(boost::in_degree(v,g)!=0){ //only print the vertices in the connected component (I already did MCC and removed edges so all the extra vertices are isolated)
std::cerr << v << std::endl;
vv.push_back(v);
}
return;
}
std::vector<Vertex> GetVector() const { return vv; }
private:
std::vector<Vertex> vv;
};
:
const
如果我离开error C2663: 'std::vector<_Ty>::push_back' : 2 overloads have no legal conversion for 'this' pointer with [ _Ty=size_t ]
,我会MyVisitor vis;
boost::depth_first_search(G, boost::visitor(vis));
。
现在,这样可以正常工作,或者至少以正确的顺序打印出正确的访问顶点:
std::vector<Vertex> vctr = vis.GetVector();
std::cout<<vctr.size();
但是当我这样做时:
vv
大小为零,因为我的boost::visitor
没有改变......
那么,当该类用作EdgeInfoProperty
的参数时,如何获得适当的类行为? (我甚至不确定这是否是合适的问题)。我需要能够根据之前访问过哪些节点来更改{{1}}(或者更确切地说,基于哪个顶点是DFS遍历中当前顶点的父节点,所以这可能只是向前迈出的第一步)
答案 0 :(得分:2)
访问者按值传递,因此您需要与复制到函数调用中的MyVisitor实例共享它所持有的向量。
试试这个:
class MyVisitor : public boost::default_dfs_visitor {
public:
MyVisitor(): vv(new std::vector<Vertex>()){}
void discover_vertex(Vertex v, const Graph& g) { //note the lack of const
if(boost::in_degree(v,g)!=0){ //only print the vertices in the connected component (I already did MCC and removed edges so all the extra vertices are isolated)
std::cerr << v << std::endl;
vv->push_back(v);
}
return;
}
std::vector<Vertex>& GetVector() const { return *vv; }
private:
boost::shared_ptr< std::vector<Vertex> > vv;
};