Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';list.sort和std::sort之间的区别是什么?_C++_Algorithm_Templates_Std - Fatal编程技术网

C++ 什么';list.sort和std::sort之间的区别是什么?

C++ 什么';list.sort和std::sort之间的区别是什么?,c++,algorithm,templates,std,C++,Algorithm,Templates,Std,我试图用clang编译下面的代码,但是得到了下面的错误 我想知道为什么使用list类中的sort会起作用,而不是std::sort #include <list> #include <iostream> int main(){ std::string strings[] = {"hello", "nihao", "byebye", "yo"}; std::list<std::string> cars(strings, strings+size

我试图用clang编译下面的代码,但是得到了下面的错误

我想知道为什么使用
list
类中的
sort
会起作用,而不是
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;
}
#包括
#包括
int main(){
std::string strings[]={“你好”、“你好”、“拜拜”、“哟”};
标准::列出汽车(字符串,字符串+sizeof(字符串)/sizeof(字符**);
//sort(std::less());//编译精细并生成排序列表
std::sort(cars.rbegin(),cars.rend(),std::less());//这个不能编译
for(std::list::iterator it=cars.begin();it!=cars.end();++it)

std::cout
std::sort
需要随机访问迭代器,而
std::list
没有提供。因此,
std::list
std::forward\u list
实现了自己的成员函数,用于对较弱迭代器进行排序。这些成员函数的复杂性保证比那些更差一种更有效的通用算法

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


请注意,
remove()
是一种类似的情况:标准算法只是一些迭代器返回的重排,而
list
成员函数一次完成查找和实际删除;这也是由于能够利用对列表内部结构的了解。

可能与
std::sort的大部分算法重复de>在
std::list
上不起作用。复杂度保证不会更差。成员函数是“近似N logn比较”,而算法是“O(N logn)比较”。考虑到成员函数将使用合并排序,而
std::sort
可能会使用某种介绍排序,回到heapsort,这正是您所期望的。@Steve:啊,事实上,我有一个彻头彻尾的误解。标准的确说列表函数使用N个log N比较,而标准算法使用N个log N比较m是“O(N日志N)”。相同的渐近性,但我认为列表版本的常量更差。可能常量更差,但请记住,标准复杂性保证只关心比较的数量,而比较合并/快速/堆启动时的主要性能因素之一是引用的位置。因此,应用于比较的常量其中的一部分不一定是主要的性能问题。我不知道heapsort最坏的比较次数是多少,不管是大于还是小于N log N,但是N log N是mergesort的最坏情况。当然,introsort的预期情况总的来说比heapsort的预期情况运行时要快。Merge sort也可以大约N个log N迭代器增量操作(事实上,由于相当简单的原因,每次比较它只执行一个增量),这很好,尽管局部性完全取决于列表的构造方式和分配器的变化无常。合并排序之所以对链表如此出色,是因为它不需要额外的内存,而合并数组则需要额外的内存。与任何排序算法一样,要了解它,请在一副卡片上手动执行它-您不需要el您缺少随机访问迭代器:-)哦,等等,我只考虑实际的合并,抱歉,它以
2*k
增量合并两个大小为
k
的块。将数据分成“一半”需要一些额外的增量。是的,当元素较大时,重新链接节点会有所帮助。请注意,插入排序使用二进制搜索插入点,只需要O(N log N)比较,而元素复制才是杀手;-)