當心使用std::map erase()

std::map在過去的舊的實現中,map::erase()的返回值類型爲void,在遍歷過程當中,若是要erase,要格外當心,由於iter會在某些狀況下失效。ide

    std::map<int, int> mapTest;
    mapTest.insert(std::make_pair(1, 1));
    mapTest.insert(std::make_pair(2, 2));
    mapTest.insert(std::make_pair(3, 3));
    mapTest.insert(std::make_pair(4, 4));
    mapTest.insert(std::make_pair(5, 5));
    
    // Wrong! to erase the last iter    
    std::map<int, int>::iterator iter = mapTest.begin();
    for(; iter != mapTest.end(); ++iter)
    {
        int key = iter->first;
        printf("%d\t", key);
        if(key == 5)
        {
            mapTest.erase(iter);
        }
    }
    // Wrong:
    std::map<int, int>::iterator iter = mapTest.begin();
    for(; iter != mapTest.end(); )
    {
        int key = iter->first;
        printf("%d\t", key);
        if(key == 5)
        {
            std::map<int, int>::iterator iterTmp = iter;            
            mapTest.erase(iterTmp);
            ++iter;
            continue;
        }
        ++iter;
    }
    // Correct:
    std::map<int, int>::iterator iter = mapTest.begin();
    for(; iter != mapTest.end(); )
    {
        int key = iter->first;
        printf("%d\t", key);
        if(key == 5)
        {
            std::map<int, int>::iterator iterTmp = iter;
            ++iter;
            mapTest.erase(iterTmp);
            continue;
        }
        ++iter;
    }
    // Correct
    std::map<int, int>::iterator iter = mapTest.begin();
    for(; iter != mapTest.end(); )
    {
        int key = iter->first;
        printf("%d\t", key);
        if(key == 5)
        {
            mapTest.erase(iter++);
            continue;
        }
        ++iter;
    }

在新版的實現中,std::map::erase返回值類型爲std::map::iterator,返回下一個iterator,那咱們在以上的狀況中,就能夠寫成:it

    std::map<int, int>::iterator iter = mapTest.begin();
    for(; iter != mapTest.end(); )
    {
        int key = iter->first;
        printf("%d\t", key);
        if(key == 5)
        {
            iter = mapTest.erase(iter);
            continue;
        }
        ++iter;
    }
相關文章
相關標籤/搜索