Pregunta

Estoy escribiendo una biblioteca para manipular gráficos de ligaduras, y estoy usando el Boost Graph Library para almacenar los datos para mí. Por desgracia, me parece que no puede encontrar la manera de poner en práctica un patrón visitante adecuada de usarlo, ya que no puede subclase cabo vértices - usted debe confiar en su lugar 'propiedades'. El marco de visitantes previsto en la biblioteca parece en gran medida encaminada a trabajar con ciertos algoritmos, donde los vértices son todos del mismo tipo, pero almacenar información diferente. En mi problema, los vértices son de diferentes tipos y almacenar diferentes tipos de información - algunos vértices son resistencias, mientras que algunos son condensadores, etc. ¿Cómo hago para escribir un patrón de visitantes que trabaja basado en una propiedad de un vértice, en lugar de el vértice mismo?

Mi único pensamiento hasta ahora ha sido escribir una pequeña clase para representar el tipo de un objeto que apunta al vértice original que necesito para obtener la información gráfica. Sin embargo, esto parece muy kludgy, y el mal de trabajar.

¿Fue útil?

Solución

¿Qué quieres decir, no se puede subclasificar a cabo vértices? Usted puede utilizar su propia clase vértice, que es sólo una cuestión de especificar en el typedef Gráfico. Incluso puede utilizar como miembros de propiedades cuando se trabaja con algoritmos BGL.

En cuanto a la inversa (que es más difícil OMI), es necesario crear una lista de propiedades vértice y acceder a ella mediante un descriptor vértice ... creo.

Editar: Se especifica clases de vértices / bordes hora de definir el tipo de gráfico:

struct Vertex {
    double some_property;
};

struct Edge {
    double weight;
};

typedef boost::adjacency_list<
    boost::listS, boost::vecS, boost::undirectedS, Vertex, Edge
> Graph; //sorry about the formatting

Graph g;

Desde donde en g [vertex_descriptor] debe devolver una referencia a Vertex, por ejemplo:.

//add 100 vertices
for (int i=0; i<100; ++i) {
    Graph::vertex_descriptor v = add_vertex(g);
    g[v].some_property = -1.0;
}

//zero some_property for all vertices
for (Graph::vertex_iterator i = vertices(g).first;
                            i != vertices(g).second;
                            ++i)
{
    g[*i].some_property = 0.0;
}

No pude encontrar mi código de visitantes hacer uso de estas propiedades pero encontré la parte correspondiente de la documentación BGL:

1) La parte sobre propiedades internas, lo que le recomienda utilizar en su lugar:
2) Bundled Propiedades

El segundo enlace parece tener un uso función de refuerzo de la toma de propiedades paquetes utilizando un puntero miembro.

¿Esto ayuda?

Otros consejos

Si a alguien le interesa, después de 2 meses, aquí es un visitante que se ve en la propiedad.

class demo_visitor : public default_bfs_visitor {
public:
    template <typename Vertex, typename Graph>
    void discover_vertex( Vertex u, Graph& g)
    {
        printf("Visited vertex %d with property %f\n",
            u, g[u].some_property);
    }
};

Si el visitante necesita para modificar las propiedades, entonces las cosas son ligeramente más complicado. Para las cuestiones - clic aquí

Tal vez podría impulsar el uso :: variante para la construcción de una suma disjunta de los tipos de vértices, luego combinar el visitante BGL con un impulso :: variante de visitantes en cada vértice?

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