为什么这些结果不同? 如果你看一下这段代码:
#include <iostream>
#include <string>
#include <algorithm>
void reduce(long ar[], int n)
{
long ar[]= {1, 4, 34, 1, 4, 67, 15 ,3 ,2 ,1, 34};
std::sort(ar, ar+n);
int size = std::unique(ar, ar+n) - ar;
std::cout << size << std::endl; // here size =7
std::cout << (int)(std::unique(ar, ar+n) - ar); // here we get 10!
}`
答案 0 :(得分:1)
我们可以,例如,查看数组,看看会发生什么。 Live demonstration
1 1 1 2 3 4 4 15 34 34 67 // after sorting 1 2 3 4 15 34 67 15 34 34 67 // after calling unique 7 // size 1 2 3 4 15 34 67 15 34 67 67 // after calling unique 10 // size
首次致电std::unique
后,范围[ar
,ar+n
)不再排序。 unique
删除连续的重复元素,并返回指向所谓“唯一”范围末尾的迭代器。此范围[ar
,ar+size
)(根据传递的第一个迭代器和返回的迭代器指定)保证不包含任何连续重复项。 未指定剩余(以下)元素的内容。
1 1 1 2 3 4 4 15 34 34 67 // after sorting 1 2 3 4 15 34 67 15 34 34 67 // after calling unique ^ ar+0 ^ ^ ar+n | iterator returned by first call to unique ####################~~~~~~~~~~~~
#
范围没有连续重复
~
内容未指定
当您第二次致电unique
时,它无法使该范围真正独一无二,因为它不再按[ar
,ar+n
)排序,而只能在[{{1}中排序},ar
)。其余未指定的元素恰好是现在有10个连续不同的元素:
1 1 1 2 3 4 4 15 34 34 67 // after sorting 1 2 3 4 15 34 67 15 34 34 67 // after calling unique 1 2 3 4 15 34 67 15 34 67 67 // after calling unique ^ ar+0 ^ ^ ^ ar+n | | iterator returned by second call to unique | iterator returned by first call to unique
请注意,第二次调用返回唯一的范围[ar+size
,迭代器)不包含任何连续重复项。