Pregunta

Estoy buscando una manera de acceder a las propiedades de vértices mediante el uso de una llave en lugar de referencia en sí vértice. Por ejemplo, si tengo

class Data
{
  public:
    std::string  name;
    unsigned int value; 
}; 
typedef boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data > Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;

en lugar de utilizar

Vertex vertex1 = boost::add_vertex( g );
g[vertex1].name  = "Alpha";
g[vertex1].value = 10;

Me gustaría tener

g["Alpha"].name  = "Alpha";
g["Alpha"].value = 10;

¿Tiene un producto listo para usar existe mecanismo?

¿Fue útil?

Solución

Creo que he encontrado tal mecanismo. Se llama labeled_graph y es una parte de BGL. En lugar de utilizar adjacency_list , se puede utilizar un envoltorio predefinido labeled_graph :

typedef boost::labeled_graph<
    boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data >,
    std::string
> Graph;

Después de definir un gráfico de este tipo, es posible acceder a los vértices de la siguiente manera:

Graph g;

boost::add_vertex( "Alpha", g );
g["Alpha"].name  = "Alpha";
g["Alpha"].value = 10;

boost::add_vertex( "Beta", g );
g["Beta"].name  = "Beta";
g["Beta"].value = 20;

boost::add_edge_by_label( "Alpha", "Beta", g );

El efecto secundario de esto es que una necesidad de utilizar gráfico de la función miembro () para realizar algunos algoritmos funcionan:

std::vector< Graph::vertex_descriptor > container;
boost::topological_sort( g.graph(), std::back_inserter( container ) ) ;

Por alguna razón, labeled_graph no se describe en la documentación de BGL, pero aparece en la carpeta de ejemplo.

Gracias por la respuesta, Serge

Otros consejos

Una lista para usar mecanismo no existe ya que el concepto no puede adjacency_list saber que quiere acceder a su propiedad vértice por un campo en una estructura.

Yo prefiero la manera de tener un mapa adicional que asigna el nombre de los datos en el vértice correspondiente. Además, se puede encapsular su algoritmo en una clase o una función, por lo que cuando se añade un nuevo vértice del mapa se completa automáticamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top