SGI

unique_copy

类别:算法 组件类型:函数

原型

unique_copy是一个重载名称;实际上有两种unique_copy函数。
template <class InputIterator, class OutputIterator>
OutputIterator unique_copy(InputIterator first, InputIterator last,
                           OutputIterator result);

template <class InputIterator, class OutputIterator, class BinaryPredicate>
OutputIterator unique_copy(InputIterator first, InputIterator last,
                           OutputIterator result,
                           BinaryPredicate binary_pred);

描述

unique_copy将元素从范围复制[first, last)到以result开头的范围中,但是,在连续重复元素组中只复制第一个元素。返回值是复制元素的目标范围末尾。此行为类似于 Unix 筛选器uniq.

有两个不同版本的unique_copy原因是对于连续元素组如何定义为重复项,存在两种不同的定义。在第一个版本中,测试是简单的相等:范围中的元素[f, l)当范围中的每个迭代器时都会重复i例如i == f或者*i == *(i-1)。在第二个版本中,测试是任意 Binary Predicatebinary_pred:中的元素[f, l)当范围中的每个迭代器时都会重复i例如i == f或者binary_pred(*i, *(i-1))true. [1]

定义

在标准头 algorithm 中定义,在非标准向后兼容头 algo.h 中定义。

对类型的要求

对于第一个版本对于第二个版本

前提条件

复杂性

线性。确切地说last - first的应用operator==(对于unique的第一个版本)或binary_pred(对于第二个版本),最多last - first赋值。

示例

打印数组中的所有数字,但只打印连续相同数字组中的第一个数字。
const int A[] = {2, 7, 7, 7, 1, 1, 8, 8, 8, 2, 8, 8};
unique_copy(A, A + sizeof(A) / sizeof(int), 
            ostream_iterator<int>(cout, " "));
// The output is "2 7 1 8 2 8".

注释

[1]严格来讲,unique_copy的第一个版本是多余的:你可以使用一个类对象来实现相同的功能equal_to作为 Binary Predicate 参数。提供第一个版本完全是为了方便:测试相等是一个重要的特例。

[2] BinaryPredicate无须等于关系。但是,在使用unique_copy含一个二元谓词(不等于关系)时要谨慎:可能会得到意外的结果。

请参阅

二元谓词, unique, remove_copy, remove_copy_if, adjacent_find
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc.版权所有。 商标信息