我有一个表示邻接列表的unordered_multimap,以及一些具有自循环的边。例如:
edges_可能是:
edges_.insert(Edges::value_type(1, std::make_pair(1, 0.0)));
edges_.insert(Edges::value_type(1, std::make_pair(1, 0.0)));
edges_.insert(Edges::value_type(1, std::make_pair(1, 0.0)));
edges_.insert(Edges::value_type(1, std::make_pair(2, 0.0)));
我想删除3个重复(1,(1,0.0))值。如果我在edges_.erase(it)行之后断开,则只删除三个重复项中的一个。
如果我在迭代中前进,无论是否增加迭代器,它都会在此之后崩溃。如何删除所有三个?
template <typename T_NodeLabel, typename T_EdgeWeight>
class Graph
{
public:
using NodeId = unsigned int;
using Nodes = std::unordered_map<NodeId, T_NodeLabel>;
using AdjacencyList = std::pair<NodeId, T_EdgeWeight>;
using Edges = std::unordered_multimap<NodeId, AdjacencyList>;
void RemoveSelfLoops(NodeId node)
{
auto edges = edges_.equal_range(node);
for (auto it = edges.first; it != edges.second;)
{
if (it->second.first == node)
{
edges_.erase(it);
}
else
{
++it;
}
}
}
private:
Nodes nodes_;
Edges edges_;
};
答案 0 :(得分:3)
调用erase
后,您的迭代器无效。然后你尝试在下一次迭代中使用它。
您需要使用erase
的返回值作为新迭代器。