3

我遇到了以下函数,它对 main() 传递的数组进行排序,删除重复项,并返回唯一元素的数量。这是我很难缠住头的最后一点。

int reduce(long ar[], int n) {
  sort(ar, ar + n);
  return unique(ar, ar + n) - ar; // ??? 
}

据我了解,unique() 返回一个指向存储数组中唯一值的段末尾的指针。但是我不明白为什么从迭代器中减去数组名称会导致 int 等于唯一元素的数量,或者为什么unique(ar, ar+n)不能将其类型转换为 int 以获得相同的结果。

4

2 回答 2

5

为什么不能将 unique(ar, ar+n) 类型转换为 int 以获得相同的结果。

因为,正如你所说,unique返回一个指针。指针是内存地址,而不是索引。因此,将指针转换为 int 是没有意义的。

为什么从迭代器中减去数组名称会导致 int 等于唯一元素的数量

减去两个指针(到同一个数组中)计算它们之间的元素数。*


* 正如@Nawaz 在下面的评论中指出的那样,此结果已签名。所以(p1 - p2) == -(p2 - p1)

于 2013-01-05T12:36:09.900 回答
5

假设你有一个这样的数组:

{1, 2, 2, 3, 4, 4, 5}

在调用之后std::unique,你可能会得到这个(谢谢你,Nawaz),新端之后的元素会像调用之前一样:

{1, 2, 3, 4, 5, 4, 5}
               ^

std::unique将迭代器返回到数组的新端,即箭头所在的位置。从那里减去数组的开头将返回唯一元素的数量是合乎逻辑的。如果你想更明确一点,你可以使用return std::distance(ar, std::unique(ar, ar + n));,当迭代器不支持减法时,它也可以工作。

于 2013-01-05T12:39:44.323 回答