在C ++中返回unique()函数

时间:2013-01-05 12:34:29

标签: c++ arrays stl iterator unique

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

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

据我所知,unique()返回一个指向段末尾的指针,该段存储数组中的唯一值。但我不明白为什么从迭代器中减去数组名会导致int等于唯一元素的数量,或者为什么unique(ar, ar+n)不能被类型化为int来实现相同的结果。

2 个答案:

答案 0 :(得分:5)

  

为什么unique(ar,ar + n)不能被类型转换为int来实现相同的结果。

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

  

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

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

<小时/> *正如@Nawaz在下面的评论中指出的那样,这个结果是签名的。所以(p1 - p2) == -(p2 - p1)

答案 1 :(得分: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));,当迭代器不支持减法时也可以使用。{/ p>