On Apr 1, 2009, at 6:19 AM, Florian.PONROY@fr.thalesgroup.com wrote:
Hi,
I want to check if a vertex_descriptor is valid before using it. As I saw on this list, I perform the following test :
Graph_t graph(10);
vertexDescriptor srcVertex = boost::vertex(424242, graph);
if (Graph_t::null_vertex() == boost::vertex(424242, graph)) { return; }
Obviously, vertex indice 424242 does not exist, but test fails, and function does not return, leading the a crash of the following algorithm (BFS or Dijkstra).
What did I do wrong?
Thanks for your help.
Hi, Florian. The call: boost::vertex(424242, graph); attempts to return the vertex_descriptor for the 424242 vertex in the graph, without validating that there in fact are 424242 in the graph. Here is the implementation for adjacency_list using a random access container for vertices (boost 1.37): template <class Graph, class Config, class Base> inline typename Config::vertex_descriptor vertex(typename Config::vertices_size_type n, const vec_adj_list_impl<Graph, Config, Base>&) { return n; } static vertex_descriptor null_vertex() { return (std::numeric_limits<vertex_descriptor>::max)(); } Here is the implementation for adjacency_list using a non-random access container for vertices: template <class Derived, class Config, class Base> inline typename Config::vertex_descriptor vertex(typename Config::vertices_size_type n, const adj_list_impl<Derived, Config, Base>& g_) { const Derived& g = static_cast<const Derived&>(g_); typename Config::vertex_iterator i = vertices(g).first; while (n--) ++i; // std::advance(i, n); (not VC++ portable) return *i; } static vertex_descriptor null_vertex() { return 0; } So in neither case are you likely to get back something equal to null_vertex() when you ask for the vertex_descriptor of the 424242th vertex in graph with 10 vertices. You could validate the index before calling boost::vertex() by checking that it falls in [0, num_vertices(g)). -- Michael