SGI

unique

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

原型

Unique是一个重载名称;实际有两个unique函数。
template <class ForwardIterator>
ForwardIterator unique(ForwardIterator first, ForwardIterator last);

template <class ForwardIterator, class BinaryPredicate>
ForwardIterator unique(ForwardIterator first, ForwardIterator last,
                       BinaryPredicate binary_pred);

说明

当逐个连续组的副本元素出现在范围内[first, last)时,算法unique移除所有除第一个元素意外的元素。即返回unique迭代器new_last使得范围[first, new_last)不包含两个连续元素副本。 [1] 范围中的迭代器[new_last, last)仍然可以去引用,但它们指向的元素未指定。Unique是稳定的,这意味着未移除元素的相对顺序保持不变。

存在两个不同版本的unique原因是存在两个不同定义,描述了连续组元素与自身副本的含义。在第一个版本中,测试是简单的相等性:范围内元素[f, l)是副本,如果对于范围内的每个迭代器i,要么i == f,要么*i == *(i-1)。在第二个版本中,测试是一个任意的 二元谓词binary_pred:中的元素[f, l)是副本,如果对于范围内的每个迭代器i,要么i == f,要么binary_pred(*i, *(i-1))true. [2]

定义

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

类型要求

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

先决条件

复杂度

线性。确切地(last - first) - 1operator==的应用(在第一个unique版本的情况下)或binary_pred(在第二个版本的情况下)。

示例

从相等int的连续组中移除重复项
vector<int> V;
V.push_back(1);
V.push_back(3);
V.push_back(3);
V.push_back(3);
V.push_back(2);
V.push_back(2);
V.push_back(1);

vector<int>::iterator new_end = unique(V.begin(), V.end());
copy(V.begin(), new_end, ostream_iterator<int>(cout, " "));
    // The output it "1 3 2 1".

s。char

inline bool eq_nocase(char c1, char c2) { return tolower(c1) == tolower(c2); }
inline bool lt_nocase(char c1, char c2) { return tolower(c1) < tolower(c2); }

int main()
{
  const char init[] = "The Standard Template Library";
  vector<char> V(init, init + sizeof(init));
  sort(V.begin(), V.end(), lt_nocase);
  copy(V.begin(), V.end(), ostream_iterator<char>(cout));
  cout << endl;
  vector<char>::iterator new_end = unique(V.begin(), V.end(), eq_nocase);
  copy(V.begin(), new_end, ostream_iterator<char>(cout));
  cout << endl;
}
// The output is:
//    aaaabddeeehiLlmnprrrStTtTy
//  abdehiLmnprSty

的矢量中移除所有重复项,不区分大小写。首先对矢量进行排序,然后从连续组中移除重复项。

注释Unique[1] 注意,“移除”的含义有些微妙。,如remove,不会销毁任何迭代器,也不会改变first.(它没有办法完成任何类似的事。)所以,例如,如果V是一个 向量remove(V.begin(), V.end(), 0)不会改变V.size(): V将只包含比之前少一个元素。Unique返回一个指向元素从中移除后生成范围的末尾的迭代器;其后的元素无关紧要。如果您正在操作 Sequence,您可能希望使用 Sequence'serase成员函数完全放弃这些元素。

[2] 严格来说,第一个版本的unique是冗余的:您可以使用类的对象获得相同的功能equal_to作为 二元谓词 参数。第一个版本严格意义上是出于便捷目的:测试相等性是一个重要的特例。

[3] BinaryPredicate不要求是等价关系。不过,使用unique和不是等价关系的 二元谓词 时需要格外小心:您很容易获得意外的结果。

另请参阅

二元谓词, ,如, remove_if, unique_copy, adjacent_find,
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息