Удаление дубликатов в мультигруппе - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь удалить элементы с одинаковым ключом и значением в мультикарте. Это мой код на данный момент. После удаления элемента я получаю исключение.

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 голосов
/ 12 мая 2018

Вы были почти правы, но трюк с удалением элементов в картах во время итерации состоит в том, чтобы захватить новый итератор, возвращенный 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;
}

Вы можете видеть, что она работает/ вилка и т. д. здесь .

...