序列去重

双指针去重法

  • 思路
  • 代码板子
//返回一个无重序列的后一位的迭代器(便于删除,仅保留无重复序列)
vector<int>::iterator unique(vector<int>& t) {
    int j = 0;
    for (int i = 0; i < t.size(); ++i) {
        if (!i || t[i] != t[i - 1]) t[j++] = t[i];
    }
    return t.begin() + j;       
}
  • STL中unique函数的去重过程实际上就是不停的把后面不重复的元素移到前面来,也可以说是用不重复的元素占领重复元素的位置,STL底层就是双指针算法,底层代码如下(源自[https://cplusplus.com/reference/algorithm/unique/])
template <class ForwardIterator>
  ForwardIterator unique (ForwardIterator first, ForwardIterator last)
{
  if (first==last) return last;              

  ForwardIterator result = first;
  while (++first != last)          
  {
    if (!(*result == *first))     
      *(++result)=*first;
  }
  return ++result;
}
  • 注意事项:
  1. 使用stl中的unique函数时一定得记得保证原序列是有序的!!!!!
posted @ 2022-07-27 20:15  SL霸霸  阅读(51)  评论(0编辑  收藏  举报