Ошибка Expression: map/set iterators incompatible при удалении элемента из контейнера map

Есть словарь:

map<int, DWORD> thread_ids;
map<int, DWORD>::iterator it_thread_ids;

for (i = 0; i < threads_count; i++)
{
    int currentThreadid = 0;
    tmp_id_thread++;
    ghThreads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)marker, &thread_ids, 0, &dwThreadID);
    currentThreadid = GetThreadId(ghThreads[i]);
    thread_ids.insert(std::pair<int, DWORD>(tmp_id_thread, currentThreadid));
}

При удалении элемента:

for (it_thread_ids = thread_ids.begin(); it_thread_ids != thread_ids.end(); it_thread_ids++)
{
    if (it_thread_ids->second ==  id_thread_to_remove)
    {
        thread_ids.erase(it_thread_ids);
    }
}

выпадает: "Expression: map/set iterators incompatible". В чём проблема?


Ответы (1 шт):

Автор решения: user7860670

Итератор на удаленный элемент становится невалидным. Надо получать новый итератор на следующий элемент:

auto it_thread_ids{thread_ids.begin()};
while (thread_ids.end() != it_thread_ids)
{
    if (it_thread_ids->second == id_thread_to_remove)
    {
        it_thread_ids = thread_ids.erase(it_thread_ids);
    }
    else
    {
        ++it_thread_ids;
    }
}
→ Ссылка