vertex property setting
Hi all! I'm new at using boost and my request certainly is obvious but I can't manage to get the error... I am trying to set std::vector's type vertex properties in a graph. But it does not want te set a property to more than one edge. The program is the following: /****************************************code*****************************/ #include <vector> #include <iostream> #include <list> #include <map> //boost includes #include <boost/property_map.hpp> #include <boost/graph/graph_traits.hpp> #include <boost/graph/properties.hpp> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/adjacency_matrix.hpp> using namespace std; enum edge_intersec_t { edge_intersec }; enum edge_dist_t { edge_dist }; enum vertex_param_t { vertex_param}; namespace boost { BOOST_INSTALL_PROPERTY(edge, intersec); BOOST_INSTALL_PROPERTY(edge, dist); BOOST_INSTALL_PROPERTY(vertex, param); } using namespace boost; typedef property<edge_intersec_t, unsigned int, property<edge_dist_t,float> > EdgeProp; typedef property<vertex_param_t,std::vector<float> > VertexProp; typedef adjacency_list<setS,vecS, bidirectionalS,VertexProp,EdgeProp> Graph; typedef graph_traits<Graph>::edge_descriptor edge_descriptor; int main(int argc, char** argv) { int NbRegions = 9; Graph g(NbRegions); edge_descriptor e; bool inserted; tie(e,inserted) = add_edge(vertex(0,g),vertex(1,g),EdgeProp(0,20),g); tie(e,inserted) = add_edge(vertex(0,g),vertex(2,g),0,g); tie(e,inserted) = add_edge(vertex(1,g),vertex(2,g),0,g); tie(e,inserted) = add_edge(vertex(3,g),vertex(4,g),0,g); tie(e,inserted) = add_edge(vertex(3,g),vertex(5,g),0,g); tie(e,inserted) = add_edge(vertex(3,g),vertex(7,g),0,g); tie(e,inserted) = add_edge(vertex(4,g),vertex(5,g),0,g); tie(e,inserted) = add_edge(vertex(5,g),vertex(6,g),0,g); tie(e,inserted) = add_edge(vertex(1,g),vertex(4,g),50,g); tie(e,inserted) = add_edge(vertex(1,g),vertex(3,g),100,g); tie(e,inserted) = add_edge(vertex(0,g),vertex(4,g),200,g); tie(e,inserted) = add_edge(vertex(2,g),vertex(5,g),500,g); tie(e,inserted) = add_edge(vertex(2,g),vertex(6,g),20,g); tie(e,inserted) = add_edge(vertex(2,g),vertex(4,g),50,g); tie(e,inserted) = add_edge(vertex(0,g),vertex(3,g),50,g); std::vector<float> param(2); std::vector<float> propriete(2); param[0] = 800; std::cerr<<"param[0] = "<<param[0]<<std::endl; param[1] = 20; std::cerr<<"param[1] = "<<param[1]<<std::endl; put(vertex_param,g,vertex(0,g),param); propriete = get(vertex_param,g,vertex(0,g)); std::cout<<"propriete[0]: "<<propriete[0]<<", propriete[1]: "<<propriete[1]<<std::endl; param.clear(); param[0] = 2; std::cerr<<"param[0] = "<<param[0]<<std::endl; param[1] = 50; std::cerr<<"param[1] = "<<param[1]<<std::endl; put(vertex_param,g,vertex(1,g),param); propriete = get(vertex_param,g,vertex(1,g)); std::cout<<"propriete[0]: "<<propriete[0]<<", propriete[1]: "<<propriete[1]<<std::endl; return 0; } /************************************************************************/ it compiles and executes, but the property of the second vertex has not been asigned. Here is the result it gives: /***************command window*************************************/ param[0] = 800 param[1] = 20 propriete[0]: 800, propriete[1]: 20 param[0] = 2 param[1] = 50 propriete[0]: 800, propriete[1]: 20 /**************************************************************************/ I tried without using "propriete" but directly"get(vertex_param,g,vertex(1,g)) [0]", and it gives a segmentation fault during the execution which confirms that the vertex property has not been asigned to the second vertex. Thanks! Camille.
On Mar 9, 2006, at 8:08 AM, Camille Lemen wrote:
param.clear();
Your problem is here. You should not be calling "clear()" on param, because that will make it have zero elements. The next line of code, that tries to write to the 0th element of param, is actually incorrect. Remove the param.clear(); line and things should work as expected.
param[0] = 2; std::cerr<<"param[0] = "<<param[0]<<std::endl; param[1] = 50; std::cerr<<"param[1] = "<<param[1]<<std::endl;
Doug
Le Jeudi 9 Mars 2006 17:08, Douglas Gregor a écrit :
On Mar 9, 2006, at 8:08 AM, Camille Lemen wrote:
param.clear();
Your problem is here. You should not be calling "clear()" on param, because that will make it have zero elements. The next line of code, that tries to write to the 0th element of param, is actually incorrect. Remove the param.clear(); line and things should work as expected.
param[0] = 2; std::cerr<<"param[0] = "<<param[0]<<std::endl; param[1] = 50; std::cerr<<"param[1] = "<<param[1]<<std::endl;
Doug _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
Thanks!!
participants (2)
-
Camille Lemen
-
Douglas Gregor