Where is erase_if?

后端 未结 6 1254
不思量自难忘°
不思量自难忘° 2021-01-07 20:51

I\'ve got a container and would like to erase elements based on a predicate. erase_if sounds familiar, but I can\'t find it in C++. What\'s the name and where i

6条回答
  •  南方客
    南方客 (楼主)
    2021-01-07 21:17

    MSVC does not yet implement C++20's std::erase_if from P1209R0 so, as a workaround, you can just copy the implementation for specific container from that paper somewhere to your code. GCC 9.1 and Clang 9.0 already have it.

    namespace std {
    
    // for std::string
    template 
    void erase_if(basic_string& c, Predicate pred) {
        c.erase(remove_if(c.begin(), c.end(), pred), c.end());
    }
    
    // for std::deque
    template 
    void erase_if(deque& c, Predicate pred) {
        c.erase(remove_if(c.begin(), c.end(), pred), c.end());
    }
    
    // for std::vector
    template 
    void erase_if(vector& c, Predicate pred) {
        c.erase(remove_if(c.begin(), c.end(), pred), c.end());
    }
    
    // for std::list
    template 
    void erase_if(list& c, Predicate pred) {
        c.remove_if(pred);
    }
    
    // for std::forward_list
    template 
    void erase_if(forward_list& c, Predicate pred) {
        c.remove_if(pred);
    }
    
    // for std::map
    template 
    void erase_if(map& c, Predicate pred) {
        for (auto i = c.begin(), last = c.end(); i != last; )
            if (pred(*i))
                i = c.erase(i);
            else
                ++i;
    }
    
    // for std::multimap
    template 
    void erase_if(multimap& c, Predicate pred) {
        for (auto i = c.begin(), last = c.end(); i != last; )
            if (pred(*i))
                i = c.erase(i);
            else
                ++i;
    }
    
    // for std::set
    template 
    void erase_if(set& c, Predicate pred) {
        for (auto i = c.begin(), last = c.end(); i != last; )
            if (pred(*i))
                i = c.erase(i);
            else
                ++i;
    }
    
    // for std::multiset
    template 
    void erase_if(multiset& c, Predicate pred) {
        for (auto i = c.begin(), last = c.end(); i != last; )
            if (pred(*i))
                i = c.erase(i);
            else
                ++i;
    }
    
    // for std::unordered_map
    template 
    void erase_if(unordered_map& c, Predicate pred) {
        for (auto i = c.begin(), last = c.end(); i != last; )
            if (pred(*i))
                i = c.erase(i);
            else
                ++i;
    }
    
    // for std::unordered_multimap
    template 
    void erase_if(unordered_multimap& c, Predicate pred) {
        for (auto i = c.begin(), last = c.end(); i != last; )
            if (pred(*i))
                i = c.erase(i);
            else
                ++i;
    }
    
    // for std::unordered_set
    template 
    void erase_if(unordered_set& c, Predicate pred) {
        for (auto i = c.begin(), last = c.end(); i != last; )
            if (pred(*i))
                i = c.erase(i);
            else
                ++i;
    }
    
    // for std::unordered_multiset
    template 
    void erase_if(unordered_multiset& c, Predicate pred) {
        for (auto i = c.begin(), last = c.end(); i != last; )
            if (pred(*i))
                i = c.erase(i);
            else
                ++i;
    }
    
    } // namespace std
    

提交回复
热议问题