Leo*_*eon 3 c++ arrays iterator stl unique
我遇到了以下函数,它对main()传递的数组进行排序,删除重复项,并返回唯一元素的数量.这是最后一点我很难缠头.
int reduce(long ar[], int n) {
sort(ar, ar + n);
return unique(ar, ar + n) - ar; // ???
}
Run Code Online (Sandbox Code Playgroud)
据我所知,unique()返回一个指向段末尾的指针,该段存储数组中的唯一值.但我不明白为什么从迭代器中减去数组名会导致int等于唯一元素的数量,或者为什么unique(ar, ar+n)不能对int进行类型转换以获得相同的结果.
为什么unique(ar,ar + n)不能被类型化为int来实现相同的结果.
因为,如你所说,unique返回一个指针.指针是内存地址,而不是索引.因此,将指针转换为int是没有意义的.
为什么从迭代器中减去数组名称会导致int等于唯一元素的数量
减去两个指针(到同一个数组中)可以计算出它们之间的元素数量.*
(p1 - p2) == -(p2 - p1).
假设您有一个这样的数组:
{1, 2, 2, 3, 4, 4, 5}
Run Code Online (Sandbox Code Playgroud)
在打电话之后std::unique,你可能最终会得到这个(谢谢你,Nawaz),因为他们曾经在电话会议之前离开新结束的元素:
{1, 2, 3, 4, 5, 4, 5}
^
Run Code Online (Sandbox Code Playgroud)
std::unique返回一个迭代器到数组的新结尾,所以箭头在哪里.从那里,从逻辑上讲,减去数组的开头将返回唯一元素的数量.如果你想更明确一些,你可以使用return std::distance(ar, std::unique(ar, ar + n));,当迭代器不支持减法时也可以使用.