list.sort和std :: sort有什么区别?

时间:2011-11-05 00:20:41

标签: c++ algorithm templates std

我正在尝试使用clang编译以下代码,但出现以下错误。

我想知道为什么使用sort课程中的list会有效,而不是std::sort

#include <list>
#include <iostream>

int main(){
    std::string strings[] = {"hello", "nihao", "byebye", "yo"};
    std::list<std::string> cars(strings, strings+sizeof(strings) / sizeof(char **));

    // cars.sort(std::less<std::string>()); // compiles fine and produce a sorted list

    std::sort(cars.rbegin(), cars.rend(), std::less<std::string>() ); // this one won't compile

    for (std::list<std::string>::iterator it = cars.begin(); it != cars.end(); ++it)
        std::cout << *it << " - ";

    std::cout << std::endl;
    return 0;
}
  

/ usr / include / c ++ / 4.2.1 / bits / stl_iterator.h:320:25:错误:无效   二进制表达式的操作数('iterator_type'(又名)         'std :: _ List_iterator&gt;')和'iterator_type')       {return __y.base() - __ x.base(); }

1 个答案:

答案 0 :(得分:13)

std::sort需要随机访问迭代器,std::list不提供。因此,std::liststd::forward_list实现了自己的成员函数,用于排序哪些函数与较弱的迭代器一起工作。 这些成员函数的复杂性保证比更高效的通用算法更复杂。 [哎呀:看评论。]

此外,成员函数可以通过简单地重新链接列表节点来利用列表数据结构的特殊性,而标准算法必须执行类似swap(或某种效果)的操作,需要对象构造,分配和删除。

注意remove()是一个类似的情况:标准算法只是一些迭代器返回重新排列,而list成员函数一次性执行查找和实际删除;再次感谢能够利用列表内部结构的知识。