不是说第二个参数是要排序元素的结束地址吗?
按道理来说,我要把这10个元素排序,只需要到a + 9
即可了。但是,如果是a + 9
的话,最后一个元素就不会参与排序了。请问是什么原因?
不是说第二个参数是要排序元素的结束地址吗?
按道理来说,我要把这10个元素排序,只需要到a + 9
即可了。但是,如果是a + 9
的话,最后一个元素就不会参与排序了。请问是什么原因?
sort
的算法实际上是很复杂的,不好看内部实现,在cppref倒是可以查到find
算法的实现,方便理解问题. 算法在迭代器的使用原则上是一致的; 前闭后开是算法入参的要求,为什么有这个要求,看实现:
template<class InputIt, class T>
InputIt find(InputIt first, InputIt last, const T& value)
{
for (; first != last; ++first) {
if (*first == value) {
return first;
}
}
return last;
}
last
就是要求在容器尾部, 用来判断是否已经遍历到头了,和普通的for循环本质上一样
// 就把10想象成第二个入参吧.
for(int i=0; i<10; ++i)
这是跟迭代器的设计思想有关系的。
sort函数传的是一个容器的开始迭代器和尾后迭代器。尾后迭代器,故名思意就是末尾元素的后面一个迭代器。
那,为什么要设计成尾后迭代器而不是尾元素迭代器呢?是因为:
for循环遍历一个容器v:
for (auto it = v.begin(); it != v.end(); it++) {
//do sth
}
如果end()迭代器是尾元素,那么这个for循环遍历的时候就会遍历不到最后一个元素。
那有的人又会说,我可以把 for循环的判断条件修改维it <= v.end()呀,这样不就可以遍历整个容器了么?
但是有一点需要注意,并不是所有容器都有 <, <=, >,>=这些比较操作的,因为有点不是连续内存地址的话,大小是无法比较出来的,比如链表,你无法比较通过<来确定哪个元素在前面。
但是 !=和 ==是肯定能比较得出来的。
综上,我们需要遍历一个容器的时候,要用到的判断条件是it != end(),也就表明,end()不能是最后一个元素,而是最后一个元素的下一个元素。
进而,sort()的参数就是尾后迭代器,进而, 你需要传递a,和 a+10。
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
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.
也就是说这个范围是 左闭右开 的