From 289fa725c02fcb2e524119a79236315b9d33b389 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Fri, 23 Jun 2017 21:33:26 +0200 Subject: [PATCH] fix illegal work with std container in graphs --- .../directed/AdjacencyListDirectedGraph.cpp | 16 +++++++++------- .../directed/AdjacencyMatrixDirectedGraph.cpp | 14 ++++++++------ .../undirected/AdjacencyListUndirectedGraph.cpp | 16 +++++++++------- .../AdjacencyMatrixUndirectedGraph.cpp | 16 +++++++++------- 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/alib2data_experimental/src/graph/directed/AdjacencyListDirectedGraph.cpp b/alib2data_experimental/src/graph/directed/AdjacencyListDirectedGraph.cpp index 34e481dcfc..9c386470ee 100644 --- a/alib2data_experimental/src/graph/directed/AdjacencyListDirectedGraph.cpp +++ b/alib2data_experimental/src/graph/directed/AdjacencyListDirectedGraph.cpp @@ -235,13 +235,15 @@ bool AdjacencyListDirectedGraph::removeNode( const Node & node ) DirectedGraph::removeNode(node); - for (auto& i : edges) { - if (node == i.getFromNode()) { - listRemoveOne(pred[i.getToNode()], node); - edges.erase(i); - } else if (node == i.getToNode()) { - listRemoveOne(succ[i.getFromNode()], node); - edges.erase(i); + for ( auto iter = edges.begin ( ); iter != edges.end ( ); ) { + if (node == iter->getFromNode()) { + listRemoveOne(pred[iter->getToNode()], node); + iter = edges.erase ( iter ); + } else if (node == iter->getToNode()) { + listRemoveOne(succ[iter->getFromNode()], node); + iter = edges.erase ( iter ); + } else { + ++iter; } } diff --git a/alib2data_experimental/src/graph/directed/AdjacencyMatrixDirectedGraph.cpp b/alib2data_experimental/src/graph/directed/AdjacencyMatrixDirectedGraph.cpp index 4edc624765..6caf427762 100644 --- a/alib2data_experimental/src/graph/directed/AdjacencyMatrixDirectedGraph.cpp +++ b/alib2data_experimental/src/graph/directed/AdjacencyMatrixDirectedGraph.cpp @@ -234,12 +234,14 @@ bool AdjacencyMatrixDirectedGraph::removeNode( const Node & node ) adj.erase(search); - for (auto& i : edges) { - if (i.getFromNode() == node) { - edges.erase(i); - } else if (i.getToNode() == node) { - adj[i.getFromNode()].erase(node); - edges.erase(i); + for ( auto iter = edges.begin ( ); iter != edges.end ( ); ) { + if (iter->getFromNode() == node) { + iter = edges.erase(iter); + } else if (iter->getToNode() == node) { + adj[iter->getFromNode()].erase(node); + iter = edges.erase(iter); + } else { + ++iter; } } diff --git a/alib2data_experimental/src/graph/undirected/AdjacencyListUndirectedGraph.cpp b/alib2data_experimental/src/graph/undirected/AdjacencyListUndirectedGraph.cpp index 47544fdbe3..a135a4c31e 100644 --- a/alib2data_experimental/src/graph/undirected/AdjacencyListUndirectedGraph.cpp +++ b/alib2data_experimental/src/graph/undirected/AdjacencyListUndirectedGraph.cpp @@ -164,13 +164,15 @@ bool AdjacencyListUndirectedGraph::removeNode( const Node & node ) adj.erase(search); UndirectedGraph::removeNode(node); - for (auto& i : edges) { - if (i.getFirstNode() == node) { - listRemoveOne(adj[i.getSecondNode()], node); - edges.erase(i); - } else if (i.getSecondNode() == node) { - listRemoveOne(adj[i.getFirstNode()], node); - edges.erase(i); + for ( auto iter = edges.begin ( ); iter != edges.end ( ); ) { + if (iter->getFirstNode() == node) { + listRemoveOne(adj[iter->getSecondNode()], node); + iter = edges.erase(iter); + } else if (iter->getSecondNode() == node) { + listRemoveOne(adj[iter->getFirstNode()], node); + iter = edges.erase(iter); + } else { + ++ iter; } } diff --git a/alib2data_experimental/src/graph/undirected/AdjacencyMatrixUndirectedGraph.cpp b/alib2data_experimental/src/graph/undirected/AdjacencyMatrixUndirectedGraph.cpp index 859b0d7c2e..9a491f9588 100644 --- a/alib2data_experimental/src/graph/undirected/AdjacencyMatrixUndirectedGraph.cpp +++ b/alib2data_experimental/src/graph/undirected/AdjacencyMatrixUndirectedGraph.cpp @@ -169,13 +169,15 @@ bool AdjacencyMatrixUndirectedGraph::removeNode( const Node & node ) adj.erase(search); UndirectedGraph::removeNode(node); - for (auto& i : edges) { - if (i.getFirstNode() == node) { - adj[i.getSecondNode()].erase(node); - edges.erase(i); - } else if (i.getSecondNode() == node) { - adj[i.getFirstNode()].erase(node); - edges.erase(i); + for ( auto iter = edges.begin ( ); iter != edges.end ( ); ) { + if (iter->getFirstNode() == node) { + adj[iter->getSecondNode()].erase(node); + iter = edges.erase(iter); + } else if (iter->getSecondNode() == node) { + adj[iter->getFirstNode()].erase(node); + iter = edges.erase(iter); + } else { + ++iter; } } -- GitLab