Я использую помеченный график
typedef boost::labeled_graph<boost::adjacency_list<boost::listS, boost::listS, boost::undirectedS, Room, RoomEdge>,std::string> MyGraph;
с
struct LineSegment{
LineSegment(){portalToRoom="";}
LineSegment(QPointF startPos_, QPointF endPos_): startPos(startPos_), endPos(endPos_) { portalToRoom="";}
QPointF startPos;
QPointF endPos;
QGraphicsLineItem* sceneItem;
std::string type;
std::string portalToRoom;
};
struct Room{
Room(){centroid.setX(-1); centroid.setY(-1);}
std::string category;
std::string vertex_id;
std::vector<LineSegment> roomLayout;
QPointF centroid;
QGraphicsRectItem* centroidSceneItem;
};
struct RoomEdge{
std::string edge_id;
};
, который позволяет мне получить доступ к вершинам с помощью строковых идентификаторов.
Я добавляю вершину и устанавливаю соответствующие поля следующим образом:
MyVertex u = boost::add_vertex(id, g);
g[id].category = category; //crashes here
g[id].vertex_id = id;
И удалите их так:
// First we remove all edges from this vertex
BGL_FORALL_VERTICES(v, g, MyGraph){
if (QString(g.graph()[v].vertex_id.c_str()).compare(roomIdToBeRemoved) == 0){
ve = v;
BGL_FORALL_OUTEDGES(v, e, g, MyGraph) {
ev.push_back(e);
}
}
}
foreach(MyEdge e, ev){
remove_edge(e,g);
}
// Then we remove the vertex itself
remove_vertex(roomIdToBeRemoved.toStdString().c_str(),g);
Пока что это похоже на работу. Проблема в том, что если я хочу добавить удаленную вершину еще раз с тем же идентификатором, я получаю следующее:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
при настройке полей вновь добавленной вершины (выше комментируется "вылетает здесь").
В чем может быть причина? Я использую функции повышения для удаления / добавления вещей.