我如何从 multimap<int, std::pair<int, bool>> 中删除重复的元素?

How can i erase duplicated elements from a multimap<int, std::pair<int, bool>>?

我有一张重复的多图。当我完成元素的收集后,我想删除重复项。

这是容器:

std::multimap<int, std::pair<int, bool>> container;

以下代码在迭代中。(它是原始版本的简化版本)

container.emplace(LeafId, std::make_pair(NodeId, isElectronic));

这是好的解决方案吗?

std::pair<int, std::pair<int, bool>> lastValue {-1 , {-1, -1}}; 
    for (auto it = container.cbegin(); it != container.cend();)
    {
        if (it->first == lastValue.first && it->second == lastValue.second)
        {
            it = container.erase(it);
        } else
        {
            lastValue = *it;
            ++it;
        }
    }

Is it good solution?

除非你在 multimap 中保持内部对排序,否则这不是一个好的解决方案,因为它会遗漏重复项。如果可以更改数据类型,则可以使用:

std::map<int, std::vector<std::pair<int, bool>>>

而不是 std::multimap,然后对每个元素排序向量并使用此处所述的标准算法删除重复项 Removing duplicates in a vector of strings

如果你不能,我建议使用额外的 std::setstd::unordered_set:

std::set<std::pair<int, bool>> tset;
int lastValue = 0;
for (auto it = container.cbegin(); it != container.cend();)
{
    if( it->first != lastValue ) {
        tset.clear();
        lastValue = it->first;
    }

    if( !tset.insert( it->second ).second )
        it = container.erase( it );
    else
        ++it;
}