草庐IT

radix_sort

全部标签

c++ - std::sort 没有复制构造

假设我有一个对象vector,其中:拷贝构造和赋值是昂贵的两个对象的默认构造和交换是廉价的。这对于引用大数据的对象来说似乎很标准——例如vector的vector。问题:有没有一种方法可以使用std::sort或标准库中的其他排序例程对这个vector进行排序,这样就不会发生复制,但是使用交换代替?我正在寻找c++0x之前的解决方案(无移动语义)。重载std::swap似乎是第一次自然而然的尝试,它确实有点帮助,但它只摆脱了一小部分复制。注意:gcc行为示例为了对1008164493625169410149162536496481进行排序,我的gccstd::sort调用了19个复制构

c++ - 为什么我不能将非常量参数函数与 stable_sort() 一起使用?

#include#include#include#includeusingnamespacestd;boolfoo(string&s1,string&s2);intmain(intargs,char*argv[]){istringstreamistrm("countselementsforwhichpredicatepreturns");vectorvec;stringword;while(istrm>>word){vec.push_back(word);}stable_sort(vec.begin(),vec.end(),foo);//ConversionError//sort(ve

c++ - std::sort 如何处理对列表?

为什么this:#include#include#include#includeusingnamespacestd;vector>list;intmain(){intone=1,two=2,three=3,five=5,six=6;stringbla="bla";list.push_back(pair(two,bla));list.push_back(pair(one,bla));list.push_back(pair(two,bla));list.push_back(pair(six,bla));list.push_back(pair(five,bla));sort(list.beg

c++ - 我可以阻止 std::sort 复制传递的比较对象吗

我们正在使用比较器对象对vector进行排序:std::vectorv=....Comparatorc=....std::sort(v.begin(),v,end(),c);但是,这会在排序期间复制c并导致性能问题,因为Comparator对象存储了一个大映射(在调用比较函数时会在其中进行查找)。我想我可以强制使用引用:constComparator&ref=c;std::sort(v.begin(),v.end(),ref);但复制仍然会发生。有没有办法防止复制,或者我是否必须让Comparator只存储指向大量数据的指针?(我不认为我们可以在我们的编译器版本中使用lambda/闭包

c++ - 当类在 main() 中时,为什么这个 std::sort 谓词会失败?

这是一个非常简化的重现,它说明了classPredicate在main()之外如何工作,但是当确切的代码显示为内联时classInlinePredicate编译器无法匹配std::sort。奇怪的是,你可以将anything作为第三个参数传递给std::sort(比如,整数7),当它这样做时你只会得到一个编译错误不支持sort期望的operator()。但是当我在下面传递pred2时,它根本不匹配:#include#include#includeusingnamespacestd;classPredicate{public:booloperator()(constpair&a,cons

c++ - 自定义迭代器适用于 std::sort 但不适用于 tbb::parallel_sort?

我正在尝试使用tbb::parallel_sort同时对2个数组进行排序。英特尔的文档在这里说https://software.intel.com/en-us/node/506167对迭代器和序列的要求与std::sort相同。。似乎并非如此。我的自定义迭代器与std::sort一起工作得很好,但与tbb::parallel_sort一起产生编译错误。请看下面的代码:intmain()//needsboostandtbbtocompile{intvalues_size=6;intnums1[]={5,8,7,89,56,4};intnums2[]={2,1,1,4,9,2};//WOR

c++ - std::sort 是否改变相等元素的相对顺序?

标准是否通过使用std::sort保证相等元素的顺序不会改变(呃,忘了那个术语),或者我是否需要考虑替代解决方案来实现这个目标? 最佳答案 std::sort不保证稳定(您试图想到的术语)。如您所料,std::stable_sort保证是稳定的。std::stable_sort还提供了对最坏情况复杂性的保证,而std::sort则没有。不过,std::sort通常平均速度更快。 关于c++-std::sort是否改变相等元素的相对顺序?,我们在StackOverflow上找到一个类似的问

c++ - std::sort 和 std::stable_sort 有什么区别?

我想知道std::sort和std::stable_sort在功能、内存和硬件方面有何不同?documentation提到“将[first,last)范围内的元素按升序排序,如排序,但stable_sort保留具有等效值的元素的相对顺序。”,但这对我来说没有意义。什么是“相对顺序”和“等值”? 最佳答案 是的,就像你说的,这不是C++独有的概念。稳定排序保留语义等值(value)的物理顺序。std::sort:Theorderofequalelementsisnotguaranteedtobepreserved.Complexity

c++ - 用基数排序实现 std::sort 的重载是否合法?

对于适用的数据类型,良好的基数排序可以大大击败比较排序,但std::sort通常实现为introsort。是否有理由不使用基数排序来实现std::sort?基数排序不足以实现std::sort,因为std::sort只要求类型具有可比性,但对于比较和基于基数的排序产生相同结果的类型回答(例如int)这似乎是悬而未决的果实,没有被采摘。在适当的时候使用基数排序的重载来实现std::sort是否合法?std::sort的要求是否有什么从根本上防止这种情况发生的?编辑:我应该更清楚一点。我在问标准库的实现是否合法。我不是在询问标准库实现的用户在std命名空间中放置任何东西。我知道这样做是违法

C++: Scott Meyers "Effective STL": item 31: know your sorting options: 帮助理解

美好的一天!ScottMeyers在他的“EffectiveSTL”中写道第三种方法是使用有序的迭代器容器中的信息,以迭代方式将列表的元素拼接到您希望它们所在的位置。如您所见,有很多选择。(第31项,第二部分)有人可以这样解释吗?更多文字(理解上下文):算法sort、stable_sort、partial_sort和nth_element需要随机访问迭代器,因此它们只能应用于vector、字符串、双端队列和数组。对标准关联容器中的元素进行排序是没有意义的,因为此类容器使用它们的比较函数来始终保持排序。我们可能想使用sort、stable_sort、partial_sort或nth_el