首页 > 解决方案 > 从 std::map 中删除元素时出错

问题描述

我正在尝试从 std::map 中删除一些元素。特别是具有

值 = 100

应该删除。但是,在运行以下代码后,会出现错误。在 erase(it) 方法之后,一个值为 100 的元素出现在剩余的映射中。错误在哪里?

代码:

#include <iostream>
#include <map>

int main() {
    std::map<int, int> outcomes;
    outcomes.clear();

    if ( !outcomes.insert( std::make_pair( 10, 1 ) ).second ) 
        return 0;
    if ( !outcomes.insert( std::make_pair( 11, 100 ) ).second ) 
        return 0;
    if ( !outcomes.insert( std::make_pair( 12, 100 ) ).second ) 
        return 0;
    if ( !outcomes.insert( std::make_pair( 13, 100 ) ).second ) 
        return 0;
    if ( !outcomes.insert( std::make_pair( 14, 100 ) ).second ) 
        return 0;
    if ( !outcomes.insert( std::make_pair( 15, 101 ) ).second ) 
        return 0;
    if ( !outcomes.insert( std::make_pair( 16, 101 ) ).second )
        return 0;
    if ( !outcomes.insert( std::make_pair( 17, 100 ) ).second )
        return 0;

    std::map<int, int>::iterator it = outcomes.begin();
    while(it != outcomes.end())
    {
        std::cout<<it->first<<" :: "<<it->second<<std::endl;
        it++;
    }

    it = outcomes.begin();
    while(it != outcomes.end())
    {
        if( it->second == 100 )
            outcomes.erase(it);
        it++;
    }
    std::cout << "after delete" << std::endl;
    it = outcomes.begin();
    while(it != outcomes.end())
    {
        std::cout<<it->first<<" :: "<<it->second<<std::endl;
        it++;
    }
    return 0;
}  

结果如下:

10 :: 1
11 :: 100
12 :: 100
13 :: 100
14 :: 100
15 :: 101
16 :: 101
17 :: 100
after delete
10 :: 1
14 :: 100
15 :: 101
16 :: 101

标签: c++c++14

解决方案


推荐阅读