删除多组中的重复项

时间:2018-05-12 02:10:50

标签: c++ visual-studio iterator multimap

我试图删除多图中具有相同键和值的元素。这是我现在的代码。删除元素后,我得到例外。

multimap<string, CStudent> m_StudentMap;
void removeDuplicates() {
    for (auto it1 = m_StudentMap.begin(); it1 != --m_StudentMap.end(); it1++) {
        for (auto it2 = next(it1, 1); it2 != m_StudentMap.end(); it2++) {
            if (it1->first == it2->first) {
                if (it1->second == it2->second) {
                    m_StudentMap.erase(it2);
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

你几乎是对的,但是迭代时在地图中擦除元素的技巧是捕获erase返回的新迭代器。我也推广了函数,因此它可以用于参数而不是仅限于m_StudentMap,并且一旦键发散就停止内循环。

template <typename K, typename V>
void removeDuplicates(std::multimap<K, V>& mmap)
{
    if (mmap.size() < 2) return;
    for (auto it = mmap.begin(); it != prev(mmap.end()); ++it)
        for (auto it2 = next(it); it2 != mmap.end() && it2->first == it->first; )
            if (it->second == it2->second)
                it2 = mmap.erase(it2);
            else
                ++it2;
}

你可以看到它运行/分叉等等。here