我遇到了以下函数,该函数对main()传递的数组进行排序,删除重复项,并返回唯一元素的数量。这是最后一点,我很难缠头。
int reduce(long ar[], int n) {
sort(ar, ar + n);
return unique(ar, ar + n) - ar; // ???
}
据我所知,unique()返回一个指向段末尾的指针,该段存储数组中的唯一值。但我不明白为什么从迭代器中减去数组名会导致int等于唯一元素的数量,或者为什么unique(ar, ar+n)
不能被类型化为int来实现相同的结果。
答案 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>