C++的sort函数第二个参数为什么不是数组的最后一个元素的地址?
不是说第二个参数是要排序元素的结束地址吗?
按道理来说,我要把这10个元素排序,只需要到a + 9
即可了。但是,如果是a + 9
的话,最后一个元素就不会参与排序了。请问是什么原因?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
不是说第二个参数是要排序元素的结束地址吗?
按道理来说,我要把这10个元素排序,只需要到a + 9
即可了。但是,如果是a + 9
的话,最后一个元素就不会参与排序了。请问是什么原因?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
The range used is [first,last), which contains all the elements between first and last, including the element pointed by first but not the element pointed by last.
也就是说这个范围是 左闭右开 的
sort
的算法实际上是很复杂的,不好看内部实现,在cppref倒是可以查到find
算法的实现,方便理解问题. 算法在迭代器的使用原则上是一致的; 前闭后开是算法入参的要求,为什么有这个要求,看实现:last
就是要求在容器尾部, 用来判断是否已经遍历到头了,和普通的for循环本质上一样这是跟迭代器的设计思想有关系的。
sort函数传的是一个容器的开始迭代器和尾后迭代器。尾后迭代器,故名思意就是末尾元素的后面一个迭代器。
那,为什么要设计成尾后迭代器而不是尾元素迭代器呢?是因为:
for循环遍历一个容器v:
如果end()迭代器是尾元素,那么这个for循环遍历的时候就会遍历不到最后一个元素。
那有的人又会说,我可以把 for循环的判断条件修改维it <= v.end()呀,这样不就可以遍历整个容器了么?
但是有一点需要注意,并不是所有容器都有 <, <=, >,>=这些比较操作的,因为有点不是连续内存地址的话,大小是无法比较出来的,比如链表,你无法比较通过<来确定哪个元素在前面。
但是 !=和 ==是肯定能比较得出来的。
综上,我们需要遍历一个容器的时候,要用到的判断条件是it != end(),也就表明,end()不能是最后一个元素,而是最后一个元素的下一个元素。
进而,sort()的参数就是尾后迭代器,进而, 你需要传递a,和 a+10。