Home C&C++函数库 c++ 语法 程序源码 Linux C库

std::

unique

函数模板  <algorithm>
equality (1)
template <class ForwardIterator>
  ForwardIterator unique (ForwardIterator first, ForwardIterator last);
predicate (2)
template <class ForwardIterator, class BinaryPredicate>
  ForwardIterator unique (ForwardIterator first, ForwardIterator last,
                          BinaryPredicate pred);

删除范围内连续的重复项

从[first,last)范围内的每一组相等元素中除去第一个元素以外的所有元素。

函数不能改变包含元素范围的对象的属性(也就是说,它不能改变数组或容器的大小): 删除是通过用下一个非重复元素替换重复元素来完成的.并通过将迭代器返回到新的结束元素 来通知缩短了范围的新大小。

保留元素的相对顺序,而返回的迭代器和last之间的元素保持有效但未指定的状态。

该函数使用operator==来比较元素对(或版本(2)中的pred)。

这个函数模板的行为相当于:
template <class ForwardIterator>
  ForwardIterator unique (ForwardIterator first, ForwardIterator last)
{
  if (first==last) return last;

  ForwardIterator result = first;
  while (++first != last)
  {
    if (!(*result == *first))  // or: if (!pred(*result,*first)) for version (2)
      *(++result)=*first;
  }
  return ++result;

☲  参数


first, last
指向一个可移动赋值元素序列初始和最终位置的前向迭代器。使用的范围是[first,last), 它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。

pred
二元函数,它接受范围中的两个元素作为参数,并返回可转换为bool的值。 返回的值表明两个参数是否相等(如果为真,它们是相等的,保留其中一个)。
函数不能修改它的任何参数。
它可以是函数指针,也可以是函数对象。

☉  返回值



指向最后一个元素后面的元素的迭代器。 first和this迭代器之间的范围包括序列中不被认为是重复的所有元素。

☣  示例



// unique algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::unique, 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};           // 10 20 20 20 30 30 20 20 10
  std::vector<int> myvector (myints,myints+9);

  // using default comparison:
  std::vector<int>::iterator it;
  it = std::unique (myvector.begin(), myvector.end());   // 10 20 30 20 10 ?  ?  ?  ?
                                                         //                ^

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

  // using predicate comparison:
  std::unique (myvector.begin(), myvector.end(), myfunction);   // (no changes)

  // 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 20 10

✥ 复杂度



对于非空范围,first和last之间的距离线性:比较每一对连续元素,并可能对其中一些执行赋值。

⇄ 数据竞争


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

☂ 异常安全性



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

🍄  另请参阅



unique_copy 复制不重复元素(函数模板)
adjacent_find 找出范围内相等的相邻元素(函数模板)
remove 覆盖范围中的值(函数模板)
remove_if 检查并覆盖范围中的值(函数模板)

联系我们 免责声明 关于CandCplus 网站地图