多么独特可以给我一个C ++容器的大小?

时间:2014-09-25 15:54:39

标签: c++

为什么这些结果不同? 如果你看一下这段代码:

#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!
}`

1 个答案:

答案 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后,范围[arar+n不再排序unique删除连续的重复元素,并返回指向所谓“唯一”范围末尾的迭代器。此范围[arar+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时,它无法使该范围真正独一无二,因为它不再按[arar+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,迭代器)不包含任何连续重复项。