Closed Ocxs closed 9 years ago
是因为list的迭代器是双向迭代器,而不是随机访问迭代器,所以不支持<,<=,<=这样的关系运算符
这句话的因果关系能解释下吗?不太理解。
std::sort
的实现可参考 这篇文章 的分析。
侯捷的《STL源码剖析》一书中给出过一个实现代码:
template <class RandomAccessIterator>
inline void sort(RandomAccessIterator first, RandomAccessIterator last) {
if (first != last) {
__introsort_loop(first, last, value_type(first), __lg(last - first) * 2);
__final_insertion_sort(first, last);
}
}
请注意观察,它的迭代器是 RandomAccessIterator
,即你说的随机访问迭代器。就这一点而言,std::list
就完全不符合,std::forward_list
也是一样。
所以用他们内置的 sort
.
@pezy 谢谢,我好像是蒙对了一半,我们不能用sort
函数是因为他只接受随机访问迭代器作为参数,而list
的迭代器是双向迭代器,而不是随即迭代器,所以不用使用std::sort
,只能使用内置的sort
。
:+1:
答案中用的是words.sort();//right,而不是sort(words.begin(), words.end());//wrong,是因为list的迭代器是双向迭代器,而不是随机访问迭代器。。
对。 建议从数据结构的角度理解一下:
std::list
的不能随机访问的原因。@Mooophy 因为list是链表结构,在计算机中不是连续内存单元存储,所以不能随机访问,但是vector是划分一段连续的内存单元,所以可以使用下标来随机访问。应该是这个原因吧
@Ocxs Yup
@pezy @Mooophy Thx ! :smile:
答案中用的是
words.sort();//right
,而不是sort(words.begin(), words.end());//wrong
,是因为list的迭代器是双向迭代器,而不是随机访问迭代器,所以不支持<,<=,<=
这样的关系运算符,所以不能这样sort(words.begin(), words.end());//wrong
使用?