头文件:
algorithm
功能:
相邻元素去重
(即“删除”序列中所有相邻
的重复
元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了)
版本一(version 1):
一般用法
template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first, ForwardIterator last);
版本二(version 2):
比较结构体元素时通常需要写自定义函数cmp()(用来判断结构体元素是否相等)
template <class ForwardIterator, class BinaryPredicate>
ForwardIterator unique (ForwardIterator first, ForwardIterator last, BinaryPredicate 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;
}
手写源码for version 1:
template <class Iterator>
Iterator my_unique(Iterator first, Iterator last)
{
if (first == last) return last;
Iterator result = first;
while (++ first != last)
{
if (*first != *result)
*(++ result) = *first;
}
return ++ result;
}
version 1 用法实例:
#include <iostream>
using namespace std;
const int N = 5e5 + 10;
int n;
int a[N];
template <class Iterator>
Iterator my_unique(Iterator first, Iterator last)
{
if (first == last) return last;
Iterator result = first;
while (++ first != last)
{
if (*first != *result)
*(++ result) = *first;
}
return ++ result;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ )
cin >> a[i];
int m = my_unique(a + 1, a + n + 1) - a - 1;
for (int i = 1; i <= m; i ++ )
cout << a[i] << ' ';
cout << endl;
for (int i = 1; i <= n; i ++ )
cout << a[i] << ' ';
cout << endl;
return 0;
}
version 2 用法实例:
#include <iostream>
#include <algorithm>
using namespace std;
struct Point
{
int a, b, c;
}point[6];
bool cmp(Point& p1, Point& p2)
{
return p1.a == p2.a && p1.b == p2.b && p1.c == p2.c;
}
int main()
{
int n;
cin >> n;
int cnt = 0;
for (int i = 0; i < n; i ++ )
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
point[cnt ++ ] = {a, b, c};
}
// 去重
int m = unique(point, point + cnt, cmp) - point;
for (int i = 0; i < m; i ++ )
printf("%d %d %d\n", point[i].a, point[i].b, point[i].c);
return 0;
}