Home C&C++函数库 c++ 语法 程序源码 Linux C库

std::

remove_if

函数模板  <algorithm>
template <class ForwardIterator, class UnaryPredicate>
  ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
                             UnaryPredicate pred);

覆盖范围中的值

改变范围[first,last),"删除"pred返回true的所有元素,并返回一个指向该范围新结束端的迭代器。

这个函数并不能真正删除元素, "删除"的方法是: 将pred返回true的元素替换为下一个不返回true的的元素, 并通过返回一个迭代器来标识缩短的范围的新大小。

这个迭代器指向认定的末尾元素(最后一个不返回true的元素)的下一个元素.

这个函数保留未"删除"元素的相对顺序,而返回的迭代器和last之间的元素保持有效但未指定的状态。

这个函数模板的行为相当于:
C++98
template <class ForwardIterator, class UnaryPredicate>
  ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
                             UnaryPredicate pred)
{
  ForwardIterator result = first;
  while (first!=last) {
    if (!pred(*first)) {
      if (result!=first)
        *result = *first;
      ++result;
    }
    ++first;
  }
  return result;
}

C++11
元素通过移动分配他们的新值.
template <class ForwardIterator, class UnaryPredicate>
  ForwardIterator remove_if (ForwardIterator first, ForwardIterator last,
                             UnaryPredicate pred)
{
  ForwardIterator result = first;
  while (first!=last) {
    if (!pred(*first)) {
      if (result!=first)
        *result = std::move(*first);
      ++result;
    }
    ++first;
  }
  return result;
}

☲  参数


first, last
指向一个支持可移动赋值序列的初始和最终位置的前向迭代器。 使用的范围是[first,last), 它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。

pred
一个一元函数,它接受范围中的一个元素作为参数, 并返回一个可转换为bool的值。返回的值指示是否要删除该元素(如果为true,则删除该元素)。
函数不应修改其参数。
它可以是函数指针,也可以是函数对象。

☉  返回值



指向最后一个未被删除元素后面的元素的迭代器。
first和this迭代器之间的范围包括序列中pred不返回true的所有元素。

☣  示例



// remove_if example
#include <iostream>     // std::cout
#include <algorithm>    // std::remove_if

bool IsOdd (int i) { return ((i%2)==1); }

int main () {
  int myints[] = {1,2,3,4,5,6,7,8,9};            // 1 2 3 4 5 6 7 8 9

  // bounds of range:
  int* pbegin = myints;                          // ^
  int* pend = myints+sizeof(myints)/sizeof(int); // ^                 ^

  pend = std::remove_if (pbegin, pend, IsOdd);   // 2 4 6 8 ? ? ? ? ?
                                                 // ^       ^
  std::cout << "the range contains:";
  for (int* p=pbegin; p!=pend; ++p)
    std::cout << ' ' << *p;
  std::cout << '\n';

  return 0;
}

输出:
the range contains: 2 4 6 8

✥ 复杂度



first1和last1之间的线性距离:对每个元素应用pred,并可能对其中一些元素执行赋值。

⇄ 数据竞争


范围[first,last)中的对象将被访问并可能被修改。

☂ 异常安全性



如果pred、元素赋值或迭代器上的任何操作抛出,则抛出。
注意,无效的参数会导致未定义的行为。

🍄  另请参阅



remove 覆盖范围中的值(函数模板)
remove_copy 复制范围内部分值(函数模板)
replace_if 替换范围内的部分值(函数模板)
transform 改变范围(函数模板)
find_if 在范围内查找元素(函数模板)

联系我们 免责声明 关于CandCplus 网站地图