相关文章推荐
std::execution::sequenced_policy, std::execution::parallel_policy, std::execution::parallel_unsequenced_policy, std::execution::unsequenced_policy
  • 有制约算法 (C++20 起)
  • std::is_execution_policy
  • std::execution::seq, std::execution::par, std::execution::par_unseq, std::execution::unseq
  • std::all_of, std::any_of, std::none_of
  • std::for_each_n
  • std::sort
  • std::reduce
  • std::inclusive_scan
  • std::exclusive_scan
  • std::random_shuffle, std::shuffle
  • std::clamp
  • std::equal
  • std::is_permutation
  • std::mismatch
  • std::swap
  • std::search
  • std::transform
  • std::for_each
  • std::make_heap
  • std::count, std::count_if
  • std::adjacent_find
  • std::find, std::find_if, std::find_if_not
  • std::find_end
  • std::find_first_of
  • std::search_n
  • std::lexicographical_compare
  • std::lexicographical_compare_three_way
  • std::copy, std::copy_if
  • std::copy_n
  • std::copy_backward
  • std::move
  • std::move_backward
  • std::shift_left, std::shift_right
  • std::fill
  • std::fill_n
  • std::generate
  • std::generate_n
  • std::iter_swap
  • std::swap_ranges
  • std::sample
  • std::remove, std::remove_if
  • std::replace, std::replace_if
  • std::reverse
  • std::rotate
  • std::unique
  • std::remove_copy, std::remove_copy_if
  • std::replace_copy, std::replace_copy_if
  • std::reverse_copy
  • std::rotate_copy
  • std::unique_copy
  • std::is_partitioned
  • std::partition_point
  • std::partition
  • std::partition_copy
  • std::stable_partition
  • std::is_sorted
  • std::is_sorted_until
  • std::stable_sort
  • std::partial_sort
  • std::partial_sort_copy
  • std::nth_element
  • std::lower_bound
  • std::upper_bound
  • std::binary_search
  • std::equal_range
  • std::merge
  • std::inplace_merge
  • std::set_difference
  • std::set_intersection
  • std::set_symmetric_difference
  • std::set_union
  • std::includes
  • std::is_heap
  • std::is_heap_until
  • std::sort_heap
  • std::push_heap
  • std::pop_heap
  • std::max
  • std::max_element
  • std::min
  • std::min_element
  • std::minmax
  • std::minmax_element
  • std::next_permutation
  • std::prev_permutation
  • std::iota
  • std::inner_product
  • std::adjacent_difference
  • std::accumulate
  • std::transform_reduce
  • std::partial_sum
  • std::transform_inclusive_scan
  • std::transform_exclusive_scan
  • std::qsort
  • std::bsearch
  • 输入/输出库
  • 文件系统库
  • 正则表达式库
  • 原子操作库
  • 线程支持库
  • 实验性 C++ 特性
  • 有用的资源
  • std 符号索引
  • 协程支持 (C++20)
  • C++ 关键词
  • template < class ForwardIt, class T >
    ForwardIt remove ( ForwardIt first, ForwardIt last, const T & value ) ;
    (C++20 前)
    template < class ForwardIt, class T >
    constexpr ForwardIt remove ( ForwardIt first, ForwardIt last, const T & value ) ;
    (C++20 起)
    template < class ExecutionPolicy, class ForwardIt, class T >
    ForwardIt remove ( ExecutionPolicy && policy, ForwardIt first, ForwardIt last, const T & value ) ;
    (C++17 起)
    template < class ForwardIt, class UnaryPredicate >
    ForwardIt remove_if ( ForwardIt first, ForwardIt last, UnaryPredicate p ) ;
    (C++20 前)
    template < class ForwardIt, class UnaryPredicate >
    constexpr ForwardIt remove_if ( ForwardIt first, ForwardIt last, UnaryPredicate p ) ;
    (C++20 起)
    template < class ExecutionPolicy, class ForwardIt, class UnaryPredicate >
    ForwardIt remove_if ( ExecutionPolicy && policy, ForwardIt first, ForwardIt last, UnaryPredicate p ) ;
    (C++17 起)

    从范围 [first, last) 移除所有满足特定判别标准的元素,并返回范围新结尾的尾后迭代器。

    1) 移除所有等于 value 的元素。
    3) 移除所有 p 对于它返回 true 的元素,用 operator == 比较它们。
    2,4) (1,3) ,但按照 policy 执行。这些重载仅若 std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> 为 true 才参与重载决议。

    通过以满足不移除的元素出现在范围起始的方式,迁移(以移动赋值的方式)范围中的元素进行移除。保持剩余元素的相对顺序,且不更改容器的 物理 大小。指向范围的新 逻辑 结尾和 物理 结尾之间元素的迭代器仍然可解引用,但元素自身拥有未指定值(因为 可移动赋值 (MoveAssignable) 的后置条件)。调用 remove 典型地后随调用容器的 erase 方法,它擦除未指定值并减小容器的 物理 大小,以匹配其新的 逻辑 大小。 若应该移除元素则返回 ​ true 的一元谓词。

    对每个(可为 const 的) VT 类型参数 v ,其中 VT ForwardIt 的值类型,表达式 p ( v ) 必须可转换为 bool ,无关乎 值类别 ,而且必须不修改 v 。从而不允许 VT & 类型参数 ,亦不允许 VT ,除非对 VT 而言移动等价于复制 (C++11 起) 。 -

    ForwardIt 必须满足 遗留向前迭代器 (LegacyForwardIterator) 的要求。 -
    解引用 ForwardIt 结果的类型必须满足 可移动赋值 (MoveAssignable) 的要求。 -
    UnaryPredicate 必须满足 谓词 (Predicate) 的要求。

    新值范围的尾后迭代器(若它不是 end ,则它指向未指定值,而此迭代器与 end 之间的迭代器所指向的任何值亦然)。

    准确应用 std:: distance ( first, last ) 次谓词。

    拥有名为 ExecutionPolicy 的模板形参的重载按下列方式报告错误:

    • 若作为算法一部分调用的函数的执行抛出异常,且 ExecutionPolicy 标准策略 之一,则调用 std::terminate 。对于任何其他 ExecutionPolicy ,行为是实现定义的。
    • 若算法无法分配内存,则抛出 std::bad_alloc

      同名的容器成员函数 list::remove list::remove_if forward_list::remove forward_list::remove_if 擦除被移除的元素。

      这些算法不可用于关联容器,如 std::set std::map ,因为 ForwardIt 不能解引用为 可移动赋值 (MoveAssignable) 类型(这些容器中的关键字不可修改)。

      标准库亦定义 std::remove 接收 const char* 的重载,用于删除文件: std::remove

      因为 std::remove 以引用接收 value ,若引用到范围 [first, last) 中的元素,则它可能有不可预期的行为。

      可能的实现

      template< class ForwardIt, class T >
      ForwardIt remove(ForwardIt first, ForwardIt last, const T& value)
          first = std::find(first, last, value);
          if (first != last)
              for(ForwardIt i = first; ++i != last; )
                  if (!(*i == value))
                      *first++ = std::move(*i);
          return first;
      
      template<class ForwardIt, class UnaryPredicate>
      ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p)
          first = std::find_if(first, last, p);
          if (first != last)
              for(ForwardIt i = first; ++i != last; )
                  if (!p(*i))
                      *first++ = std::move(*i);
          return first;
      

      下列代码从 string 移除所有空格,通过迁移所有非空格字符到左侧,再擦除其他内容。这是擦除移除手法的样例。

      #include <algorithm>
      #include <string>
      #include <iostream>
      #include <cctype>
      int main()
          std::string str1 = "Text with some   spaces";
          str1.erase(std::remove(str1.begin(), str1.end(), ' '),
                     str1.end());
          std::cout << str1 << '\n';
          std::string str2 = "Text\n with\tsome \t  whitespaces\n\n";
          str2.erase(std::remove_if(str2.begin(), 
                                    str2.end(),
                                    [](unsigned char x){return std::isspace(x);}),
                     str2.end());
          std::cout << str2 << '\n';
      
      Textwithsomespaces
      Textwithsomewhitespaces
      复制一个范围的元素,忽略满足特定判别标准的元素
      (函数模板) 移除范围内的连续重复元素
      (函数模板)
     
    推荐文章