使用 equal_range() 和 erase() 擦除多映射中除一对之外的所有对

Erasing all but one pairs in a multimap, using equal_range() and erase()

本文关键字:range equal erase 使用 擦除 映射      更新时间:2023-10-16

我读了很多书,找不到这个问题的答案。我有一个多映射,其中包含成对的<Class object, enum class>,并使用std::multimap.equal_range()我获得了其中所有重复键的范围。下一步是我想删除所有这些重复项,除了一个。我的以下代码删除了所有这些,没有留下给定键的对。无论如何,我可以简单地删除除其中一个之外的所有内容吗?

void removeDuplicates( const string& strToRemove ) {
        CFile obj (strToRemove, 0);       
            pair <multimap<CFile,Filetype>::iterator, multimap<CFile,Filetype>::iterator> ret;
            ret = m_DirectoryMap.equal_range(obj);
            for (multimap<CFile,Filetype>::iterator it=ret.first; it!=ret.second; ++it) {
                it = m_DirectoryMap.erase(it);
            }
}

就像我提到的,使用以下代码,如果我有 3 对具有相同密钥的密钥,它们都会被删除。我想删除 n-1 个重复项,而不是 n

it=mymap.erase(it)之后递增it对我来说看起来不对。

你应该这样做

auto it=ret.first;
if (it!=ret.second)
{
    ++it;
    while (it!=ret.second)
        it=mymap.erase(it);
}