Erase/Remove contents from the map (or any other STL container) while iterating it

前端 未结 9 1382
无人及你
无人及你 2020-12-01 07:55

Allegedly you cannot just erase/remove an element in a container while iterating as iterator becomes invalid. What are the (safe) ways to remove the elements that meet a cer

9条回答
  •  不知归路
    2020-12-01 08:24

    template 
    void eraseIf( Container& container, Predicate predicate  ) {
        container.erase( remove_if( container.begin(), container.end(), predicate ), container.end() );
    }   
    
    // pre-c++11 version
    template 
    void eraseIf( std::map& container, Predicate predicate) {
        typename std::map::iterator iter = container.begin();
        while(iter!=container.end()) { 
            iterator current = iter++;
            if(predicate(*current))
                container.erase(current);
        }
    }
    
    // c++11 version
    template 
    void eraseIf( std::map& container, Predicate predicate) {
        auto iter = container.begin();
        while(iter!=container.end()) {
            if(predicate(*iter))
                iter = container.erase(iter);
            else
                ++iter;
        }
    }
    

提交回复
热议问题