Я пытаюсь прочитать файл graphml с помощью библиотеки BGL.Я могу успешно прочитать файл и собрать свойства, связанные с каждым узлом.
Однако записи узла в моем файле graphml также имеют нетривиальный идентификатор, который я хотел бы получить.Лучше всего было бы использовать эту строковый идентификатор в качестве индекса узла, но это может быть недостижимо из-за того факта, что будет накладывать ограничение на VertexList дальше, чем на контейнер.Поэтому, по крайней мере, я бы хотел, чтобы информация об идентификаторе была сохранена и чтобы я мог получить к ней доступ.При написании графика сразу после этого идентификаторы узлов заменяются на «n0», «n1», ... что наводит меня на мысль, что boost не хранит информацию об идентификаторе узла.Это действительно так?Я что-то пропустил?
Ниже приведен код, который я использую:
struct VertexProperty
{
std::string name ;
};
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, VertexProperty, boost::no_property> Graph;
int main(){
std::ifstream inFile;
inFile.open("in.graphml", std::ifstream::in);
if(!inFile.good()){
std::cout << "could not open file" << std::endl;
return 1;
}
Graph g;
boost::dynamic_properties dp(boost::ignore_other_properties);
dp.property("name", boost::get(&VertexProperty::name, g));
boost::read_graphml(inFile, g, dp);
std::cout << boost::num_vertices(g) << std::endl;
std::cout << g[0].name << std::endl; // I can access the node indexed by 0 properties like this
std::cout << get(&VertexProperty::name, g, 0) << std::endl; // I can retrieve a property value like that as well
std::cout << get(boost::vertex_index, g, 0) << std::endl; // doesn't give me the node id unfortunately
std::ofstream out("out.graphml", std::ofstream::out);
boost::write_graphml(out, g, dp);
return 0;
}