# std::erase_if (std::unordered_multiset)

< cpp‎ | container‎ | unordered multiset

定义于头文件 `<unordered_set>` |  |
template< class Key, class Hash, class KeyEqual, class Alloc, class Pred > typename std::unordered_multiset<Key,Hash,KeyEqual,Alloc>::size_type erase_if(std::unordered_multiset<Key,Hash,KeyEqual,Alloc>& c, Pred pred); |  | (C++20 起)

从容器中擦除所有满足谓词 `pred` 的元素。等价于

    auto old_size = c.size();
    for (auto i = c.begin(), last = c.end(); i != last; ) {
      if (pred(*i)) {
        i = c.erase(i);
      } else {
        ++i;
      }
    }
    return old_size - c.size();

### 参数

c | - | 要从中擦除的元素
pred | - | 若应该擦除元素则对它返回 true 的谓词

### 返回值

擦除的元素数。

### 复杂度

线性。

### 示例

    #include <unordered_set>
    #include <iostream>

    template<typename Os, typename Container>
    inline Os& operator<<(Os& os, Container const& container)
    {
        os << "{ ";
        for (const auto& item : container) {
            os << item << ' ';
        }
        return os << "}";
    }

    int main()
    {
        std::unordered_multiset data { 0, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7 };
        std::cout << "Original:\n" << data << '\n';

        auto divisible_by_3 = [](auto const& x) { return (x % 3) == 0; };

        const auto count = std::erase_if(data, divisible_by_3);

        std::cout << "Erase all items divisible by 3:\n" << data << '\n'
                  << count << " items erased.\n";
    }

输出：

    Original:
    { 7 6 6 5 5 4 3 3 2 1 0 }
    Erase all items divisible by 3:
    { 7 5 5 4 2 1 }
    5 items erased.

### 参阅

remove remove_if | 移除满足特定判别标准的元素 (函数模板)