erase_if在哪里?

时间:2010-08-06 14:56:12

标签: c++ stl

我有一个容器,想根据谓词擦除元素。 erase_if听起来很熟悉,但我在C ++中找不到它。名称是什么,它在哪里定义? 我想在VS10中使用lambda。

7 个答案:

答案 0 :(得分:19)

您可能正在寻找std::remove_if,例如:

vec.erase(std::remove_if(vec.begin(), vec.end(), predicate), vec.end());

答案 1 :(得分:4)

我猜你正在考虑remove_if,它使用谓词来确定是否应该删除该元素。

remove_if返回一个迭代器,指向要在容器中删除的元素的开头。要实际删除它们,您需要使用erase

container.erase(remove_if(container.start(), container.end(), pred), container.end())

或者你错误地回忆起了copy_if算法?这在某种程度上被排除在标准之外,但在Effective STL中被写入并实施了。

答案 2 :(得分:3)

答案 3 :(得分:2)

实际上,pointer containers的Boost库中存在一个名为erase_if的方法。

答案 4 :(得分:0)

有一个list::remove_if,但不适用于所有容器类。 remove_if也作为算法存在,可以与begin()end()获得的迭代器一起使用。

答案 5 :(得分:0)

MSVC尚未从P1209R0实现C ++ 20的std::erase_if,因此,作为一种变通办法,您只需将特定容器的实现从该文件复制到代码中的某个地方即可。 GCC9.1和clang9.0已经拥有它。

namespace std {

// for std::string
template <class charT, class traits, class A, class Predicate>
void erase_if(basic_string<charT, traits, A>& c, Predicate pred) {
    c.erase(remove_if(c.begin(), c.end(), pred), c.end());
}

// for std::deque
template <class T, class A, class Predicate>
void erase_if(deque<T, A>& c, Predicate pred) {
    c.erase(remove_if(c.begin(), c.end(), pred), c.end());
}

// for std::vector
template <class T, class A, class Predicate>
void erase_if(vector<T, A>& c, Predicate pred) {
    c.erase(remove_if(c.begin(), c.end(), pred), c.end());
}

// for std::list
template <class T, class A, class Predicate>
void erase_if(list<T, A>& c, Predicate pred) {
    c.remove_if(pred);
}

// for std::forward_list
template <class T, class A, class Predicate>
void erase_if(forward_list<T, A>& c, Predicate pred) {
    c.remove_if(pred);
}

// for std::map
template <class K, class T, class C, class A, class Predicate>
void erase_if(map<K, T, C, A>& 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 <class K, class T, class C, class A, class Predicate>
void erase_if(multimap<K, T, C, A>& 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 <class K, class C, class A, class Predicate>
void erase_if(set<K, C, A>& 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 <class K, class C, class A, class Predicate>
void erase_if(multiset<K, C, A>& 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 <class K, class T, class H, class P, class A, class Predicate>
void erase_if(unordered_map<K, T, H, P, A>& 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 <class K, class T, class H, class P, class A, class Predicate>
void erase_if(unordered_multimap<K, T, H, P, A>& 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 <class K, class H, class P, class A, class Predicate>
void erase_if(unordered_set<K, H, P, A>& 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 <class K, class H, class P, class A, class Predicate>
void erase_if(unordered_multiset<K, H, P, A>& c, Predicate pred) {
    for (auto i = c.begin(), last = c.end(); i != last; )
        if (pred(*i))
            i = c.erase(i);
        else
            ++i;
}

} // namespace std

答案 6 :(得分:0)

使用新的 C++ 20 格式,您可以像这样使用它:

vector<int> vec {1,2,3,4,5};
auto no_of_removed_elements = std::erase_if(vec,[](const int a){return a==5;});

Link to the reference.