ReadingLab / Discussion-for-Cpp

C++ 中文讨论区
MIT License
89 stars 63 forks source link

A question about ex10.42 #14

Closed Ocxs closed 9 years ago

Ocxs commented 9 years ago
void elimDups(list<string> &words)
{
    words.sort();
    words.unique();
}

答案中用的是words.sort();//right,而不是sort(words.begin(), words.end());//wrong,是因为list的迭代器是双向迭代器,而不是随机访问迭代器,所以不支持<,<=,<=这样的关系运算符,所以不能这样sort(words.begin(), words.end());//wrong使用?

pezy commented 9 years ago

是因为list的迭代器是双向迭代器,而不是随机访问迭代器,所以不支持<,<=,<=这样的关系运算符

这句话的因果关系能解释下吗?不太理解。

pezy commented 9 years ago

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.

Ocxs commented 9 years ago

@pezy 谢谢,我好像是蒙对了一半,我们不能用sort函数是因为他只接受随机访问迭代器作为参数,而list的迭代器是双向迭代器,而不是随即迭代器,所以不用使用std::sort,只能使用内置的sort

pezy commented 9 years ago

:+1:

Mooophy commented 9 years ago

答案中用的是words.sort();//right,而不是sort(words.begin(), words.end());//wrong,是因为list的迭代器是双向迭代器,而不是随机访问迭代器。。

对。 建议从数据结构的角度理解一下:

Ocxs commented 9 years ago

@Mooophy 因为list是链表结构,在计算机中不是连续内存单元存储,所以不能随机访问,但是vector是划分一段连续的内存单元,所以可以使用下标来随机访问。应该是这个原因吧

Mooophy commented 9 years ago

@Ocxs Yup

Ocxs commented 9 years ago

@pezy @Mooophy Thx ! :smile: