函式模板
<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) 中的物件被訪問並可能被修改。

異常

如果任何元素比較、元素賦值或迭代器操作丟擲異常,則丟擲異常。
請注意,無效引數會導致未定義行為

另見