小编典典

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

algorithm

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

我想知道为什么sortlist课堂上使用会起作用,但不会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’(aka’std
:: _ List_iterator>’)和’iterator_type’)无效的操作数{返回__y .base()-__x.base(); }


阅读 672

收藏
2020-07-28

共1个答案

小编典典

std::sort需要不提供的 随机访问
迭代器std::list。因此,std::liststd::forward_list实现自己的成员函数排序其工作,其较弱的迭代器。
这些成员函数的复杂度保证要比更有效的通用算法的复杂度保证差。 [呼:查看评论。]

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

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

2020-07-28