返回c++中的unique()函数

Returning unique() function in C++

本文关键字:函数 unique c++ 中的 返回      更新时间:2023-10-16

我遇到了下面的函数,它对main()传递的数组进行排序,删除重复项,并返回唯一元素的个数。这是我脑子里最后一个难以理解的部分。

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

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

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

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

为什么从迭代器中减去数组名会得到一个int型,该int型等于唯一元素的个数

* 将两个指针(放入同一个数组中)相减,计算出它们之间的元素个数。


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

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

{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));,它在迭代器不支持减法时也可以工作。