函式模板
<algorithm>

std::unique_copy

相等 (1)
template <class InputIterator, class OutputIterator>  OutputIterator unique_copy (InputIterator first, InputIterator last,                              OutputIterator result);
謂詞 (2)
template <class InputIterator, class OutputIterator, class BinaryPredicate>  OutputIterator unique_copy (InputIterator first, InputIterator last,                              OutputIterator result, BinaryPredicate pred);
複製範圍並移除重複項
將範圍 [first,last) 中的元素複製到以 result 開頭的範圍中,但會跳過連續的重複項(與前一個元素相等的元素)。

僅複製範圍 [first,last) 中每個連續等價元素組的第一個元素。

元素之間的比較是透過應用 operator== 或模板引數 pred(用於第二個版本)來實現的。

此函式模板的行為等同於
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class InputIterator, class OutputIterator>
  OutputIterator unique_copy (InputIterator first, InputIterator last,
                              OutputIterator result)
{
  if (first==last) return result;

  *result = *first;
  while (++first != last) {
    typename iterator_traits<InputIterator>::value_type val = *first;
    if (!(*result == val))   // or: if (!pred(*result,val)) for version (2)
      *(++result)=val;
  }
  return ++result;
}

引數

first, last
前向迭代器,指向序列的起始和結束位置。使用的範圍是 [first,last),其中包含 firstlast 之間的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
如果 InputIterator 是一個單次遍歷迭代器,那麼它指向的型別必須是可複製構造可複製賦值的。
result
輸出迭代器,指向結果範圍的起始位置。
被指向的型別應支援被賦值為範圍 [first,last) 中某個元素的值。
pred
二元函式,接受範圍內的兩個元素作為引數,並返回一個可轉換為 bool 的值。返回的值指示兩個引數是否被視為等價(如果為 true,則它們等價,其中一個將被移除)。
該函式不得修改其任何引數。
這可以是指標函式,也可以是函式物件。

這些範圍不應重疊。

返回值

一個指向已複製範圍結束位置的迭代器,該範圍不包含連續的重複項。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// unique_copy example
#include <iostream>     // std::cout
#include <algorithm>    // std::unique_copy, std::sort, std::distance
#include <vector>       // std::vector

bool myfunction (int i, int j) {
  return (i==j);
}

int main () {
  int myints[] = {10,20,20,20,30,30,20,20,10};
  std::vector<int> myvector (9);                            // 0  0  0  0  0  0  0  0  0

  // using default comparison:
  std::vector<int>::iterator it;
  it=std::unique_copy (myints,myints+9,myvector.begin());   // 10 20 30 20 10 0  0  0  0
                                                            //                ^

  std::sort (myvector.begin(),it);                          // 10 10 20 20 30 0  0  0  0
                                                            //                ^

  // using predicate comparison:
  it=std::unique_copy (myvector.begin(), it, myvector.begin(), myfunction);
                                                            // 10 20 30 20 30 0  0  0  0
                                                            //          ^

  myvector.resize( std::distance(myvector.begin(),it) );    // 10 20 30

  // print out content:
  std::cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

輸出
myvector contains: 10 20 30


複雜度

最多線性於 firstlast 之間的距離:比較每對元素,並對不匹配的元素執行賦值操作。

資料競爭

訪問範圍 [first,last) 中的物件。
修改 result 和返回的迭代器之間的範圍內的物件。

異常

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

另見