Я использую подталкивание graph_traits и определил график так:Удаление нескольких вершин из подталкивание :: adjacency_list графа
typedef boost::adjacency_list <boost::setS, boost::vecS, boost::undirectedS, NodeInfo, EdgeInfo> Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;
Каждые из моих вершин имеют координаты attatched, и я намерен найти дубликаты вершин (вершины в том же месте). Поэтому я построить список, содержащий эти «кластеры»:
std::vector<std::vector<Vertex>> clusters;
Теперь я попытался объединить каждый кластер в одной вершине (список вершин). Для этого я вызова для каждой вершины кластера clusters[i]
:
boost::clear_vertex(v, graph)
boost::remove_vertex(v, graph);
Однако я заметил, что до сих пор остаются дубликаты. Я думаю, что это связано с изменениями индексов при удалении, поскольку я использую vecS
для списка вершин.
В чем причина этого и как его решить?
Можно ли сортировать список вершин, чтобы удалить в порядке убывания и удалить их таким образом безопасно (как на удаление индекс i должен влиять только на индексы> i в std :: vector)? – Chris
В принципе, да. Тем не менее, я буду придерживаться документированных гарантий стабильности/недействительности. И «remove_vertex(), который при использовании с adjacency_list, где VertexList = vecS, делает недействительными все итераторы и дескрипторы для графика« does ** not ** дает вам этот левый путь ». – sehe
Я тестировал его, и он не работал так, как я ожидал. Возможно, мои предположения о том, как это работает внутри, были неправильными. Теперь я попытался использовать filter_graph, но не смог преобразовать его обратно в список adjacency_list. – Chris