函数模板
<algorithm>

std::remove

template <class ForwardIterator, class T>  ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
从范围中移除值
[注意:这是算法remove的参考。有关<cstdio>的remove,请参阅remove]

将范围[first,last)转换为一个范围,移除所有与val相等的元素,并返回指向该范围新结束位置的迭代器。

该函数不能改变包含元素范围的对象的属性(即,它不能改变数组或容器的大小):移除是通过将与val相等的元素替换为下一个不相等的元素来完成的,并通过返回指向应被视为其新结束之后元素的迭代器来指示缩短范围的新大小。

未移除元素的相对顺序被保留,而返回的迭代器与 last 之间的元素处于有效但未指定的状态。

该函数使用 operator== 将单个元素与 val 进行比较。

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class ForwardIterator, class T>
  ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
{
  ForwardIterator result = first;
  while (first!=last) {
    if (!(*first == val)) {
      if (result!=first)
        *result = *first;
      ++result;
    }
    ++first;
  }
  return result;
}
元素通过移动赋值其新值来替换。

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class ForwardIterator, class T>
  ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
{
  ForwardIterator result = first;
  while (first!=last) {
    if (!(*first == val)) {
      if (result!=first)
        *result = move(*first);
      ++result;
    }
    ++first;
  }
  return result;
}

参数

first, last
Forward iterators 指向序列的初始和结束位置,其中包含可移动赋值的元素,并支持与类型T的值进行比较。使用的范围是[first,last),它包含firstlast之间的所有元素,包括first指向的元素,但不包括last指向的元素。
val
要移除的值。

返回值

指向序列中最后一个未移除元素的下一个元素的迭代器。
范围first与此迭代器之间包含序列中所有与val不相等的元素。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// remove algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::remove

int main () {
  int myints[] = {10,20,30,30,20,10,10,20};      // 10 20 30 30 20 10 10 20

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

  pend = std::remove (pbegin, pend, 20);         // 10 30 30 10 10 ?  ?  ?
                                                 // ^              ^
  std::cout << "range contains:";
  for (int* p=pbegin; p!=pend; ++p)
    std::cout << ' ' << *p;
  std::cout << '\n';

  return 0;
}

输出
range contains: 10 30 30 10 10


复杂度

线性复杂度,与firstlast之间的距离成正比:比较每个元素,并可能对其中一些元素进行赋值。

数据竞争

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

异常

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

另见