📜  在C++ STL中列出unique()(1)

📅  最后修改于: 2023-12-03 14:51:14.835000             🧑  作者: Mango

C++ STL中的unique()

在C++ STL中,std::unique()是用于在容器中去重的算法函数。它可以去除相邻的重复元素,将其压缩到容器的前端,最后返回去重后的最后一个元素的下一个位置的迭代器。

基本语法
template <class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIt last);

template <class ForwardIt, class BinaryPredicate>
ForwardIt unique(ForwardIt first, ForwardIt last, BinaryPredicate p);

其中,firstlast是所给定序列的起始和结束迭代器。

第一个重载的函数仅通过 == 运算符形成相邻元素的比较。

第二个重载的函数可以接收一个自定义的相等函数 predicate 作为可调用类型,以形成相邻元素的比较。

示例
#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
  std::vector<int> vec{1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
  
  // 去重
  auto last = std::unique(vec.begin(), vec.end());
  vec.erase(last, vec.end());
  
  // 输出
  for (int i : vec) {
    std::cout << i << " ";
  }
}

输出:

1 2 3 4 
性质
  • 在执行成功的范围内,每个等效 group 的第一个元素是前一个 group 的最后一个元素。

  • 执行成功后,序列尾部的未去重序列保持未定义状态,调用 erase() 对此部分进行更改是安全的。

  • std::unique() 并不实际改变容器大小,需要手动通过 erase() 调整大小。

注意
  • 对已排序的容器执行 unique() 将保留唯一的元素,并将其移动到容器的起始处。

  • 对于未排序的容器,unique() 并不能保证元素的之前的顺序。如果需要保留容器中的原始顺序,请先将容器排序再执行 unique()

  • std::unique() 可以用于任何 STL 容器,包括数组。

总结

std::unique() 是一个常用的 STL 算法函数,可用于去除容器中的重复元素并将其压缩到容器的前端,从而减小容器的大小并优化代码性能。本文介绍了该函数的基本语法、示例、性质和注意事项,希望对C++程序员能有所帮助。