Просто пытаюсь разобраться с библиотекой графов ускорения, и у меня есть несколько вопросов. Я пишу некоторый код, который является классом-оболочкой для графа BGL. Идея состоит в том, что я могу манипулировать графиком так, как хочу, а затем вызвать метод-обертку для вывода графика в формате GEXF (XML).
Мой код выглядит примерно так:
struct Vertex {
std::string label;
...
};
struct Edge {
std::string label;
double weight;
...
};
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, Vertex, Edge> GraphType;
template <typename Graph>
class GEXF
{
private:
Graph graph;
...
};
template <typename Graph>
void GEXF<Graph>::buildXML()
{
...
// output the edges
property_map<adjacency_list<>, edge_index_t>::type edge_id = get(edge_index, graph);
GraphType::edge_iterator e, e_end;
for(tie(e, e_end) = edges(graph); e != e_end; ++e)
{
xmlpp::Element *edge = ePtr->add_child("edge");
// next line gives an error, property not found
edge->set_attribute("id", tostring<size_t>(get(edge_id, *e)));
edge->set_attribute("source", tostring<size_t>(source(*e, graph)));
edge->set_attribute("target", tostring<size_t>(target(*e, graph)));
}
}
...
// instantiate in main():
GEXF<GraphType> gexf;
Вот мои вопросы:
Когда я использую связанные свойства, я могу получить доступ к vertex_index, но не могу получить доступ к edge_index. Как получить доступ к краевым индексам?
В приведенном выше коде я хотел сохранить универсальный класс GEXF, но столкнулся с проблемой при попытке объявить Graph::edge_iterator e, e_end;
Приведенный выше код работает, но он использует конкретный тип. Как я должен объявлять edge_iterator вообще?