正在从无序多重映射中删除元素

Removing elements from an unordered_multimap

本文关键字:映射 删除 元素 无序      更新时间:2023-10-16

我有一个表示邻接列表的无序多映射,以及几个具有自循环的边。例如:

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_;
};

调用erase后,迭代器无效。然后你试着在下一次迭代中使用它。

您需要使用返回值erase作为新的迭代器。