2017-01-30 2 views
3

Я использую подталкивание 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 для списка вершин.

В чем причина этого и как его решить?

ответ

2

Для vectorS дескрипторы столь же неустойчивы, как итераторы: они становятся недействительными при вставке/удалении. См. Iterator and Descriptor Stability/Invalidation

Конечно, решение, описанное здесь (с использованием listS), может не распространяться на вашу ситуацию.

В этом случае переосмыслите свою проблему и рассмотрите фильтрацию графика (без фактического удаления вершин) или отметьте вершины как удаленные. Смотрите здесь для вдохновения:

+0

Можно ли сортировать список вершин, чтобы удалить в порядке убывания и удалить их таким образом безопасно (как на удаление индекс i должен влиять только на индексы> i в std :: vector)? – Chris

+0

В принципе, да. Тем не менее, я буду придерживаться документированных гарантий стабильности/недействительности. И «remove_vertex(), который при использовании с adjacency_list, где VertexList = vecS, делает недействительными все итераторы и дескрипторы для графика« does ** not ** дает вам этот левый путь ». – sehe

+0

Я тестировал его, и он не работал так, как я ожидал. Возможно, мои предположения о том, как это работает внутри, были неправильными. Теперь я попытался использовать filter_graph, но не смог преобразовать его обратно в список adjacency_list. – Chris

Смежные вопросы