草庐IT

Sort_Placement

全部标签

c++ - 在初始化内存上使用 placement new 是否合法?

我正在探索在C++中实现真正(部分)不可变数据结构的可能性。由于C++似乎不区分变量和变量存储的对象,因此真正替换对象(无需赋值操作!)的唯一方法是使用placementnew:autovar=Immutable(state0);//thefollowingisillegalasitrequiresassignmentto//animmutableobjectvar=Immutable(state1);//however,thefollowingwouldworkasitconstructsanewobject//inplaceoftheoldonenew(&var)Immutable

c++ - 为什么 std::map 没有 find/lower_bound 重载,std::list 没有 sort 重载?

我知道你不应该使用std::find(some_map.begin(),some_map.end())或std::lower_bound,因为它会采用线性时间而不是some_map.lower_bound提供的对数时间。std::list也会发生类似的事情:有用于排序的std::list::sort函数,但您无法调用std::sort(some_list.begin(),some_list.end()),因为迭代器不是随机访问的。但是,例如,std::swap具有标准容器的重载,因此swap(some_map,other_map)的调用需要O(1),而不是在)。为什么C++标准不为ma

c++ - 为什么 std::sort 不接受函数内声明的比较类

我当时正在工作,在一个函数中编写比较器(稍后移动,当我决定最好的地方时),并注意到了这个特性。我想了一会儿,意识到我不明白为什么如果我使用内部比较器代码将无法编译,但外部比较器很好。有什么解释吗?快速测试工具:#include#include#includeclassCompareMe{public:CompareMe(intin):toCompare(in){}inttoCompare;};classComparators{public:booloperator()(CompareMe*first,CompareMe*second){returnfirst->toComparetoC

c++ - qsort() vs std::sort,比较函数哲学差异

我想知道为什么在qsort(){Cversion}和std::sort()中有两种完全不同的方法来指定比较函数。qsort需要这样的比较函数:不知道为什么需要三种返回值-1、0、+1。intcomp(int*x,int*y){return*x-*y;}而std::sort()的比较函数对我来说看起来更一致,因为它是根据函数编写的,遵循不变量。即如果x小于y函数返回true,则x相对于y处于正确位置boolcomp(intx,inty){returnx当返回一个bool(或具有两个值0和1的int)更简单和干净时,为什么我们需要三个值-1,0,+1? 最佳答案

c++ - 在对对象的 vector 进行排序时使用 stable_sort

我有classPassanger有变量stringname;stringstation;stringticket;然后我有另一个类,在这个类中我有vectormyQueue;现在我想使用stable_sort排序myQueue.有没有可能,怎么说给stable_sort,应该是什么key,根据它排序myQueue?std::stable_sort(myQueue.begin(),myQueue.end(),maybeSomethingElse());? 最佳答案 std::stable_sort()过载接受自定义比较器作为其第三个参

c++ - std:sort 与插入 std::set

我正在从cin读取一些线段。每条线段由起点和终点表示。2D。X和Y。输入未排序。它是随机排列的。(更新:但我需要它们先按X再按Y排序)我可以读取所有段,将它们存储在一个vector中,然后调用std::sort。另一方面,我可以创建一个空的std::set并在每个段到达时插入它。该集合将自动维护排序顺序。这两种方法哪种更有效?更新:输入的总大小(段数)是预先知道的。 最佳答案 您应该测量这两种方法的性能以确保确定,但可以安全地假设std::vector上的std::sort是way比插入std::set更快,因为局部效应和隐藏在树插

c++ - 为什么 std::sort 会在此代码上抛出段错误?

有人可以解释为什么下面的排序会导致段错误吗?这是g++(指针的排序vector)的已知错误吗?我正在使用g++4.5.2进行编译。#include#include#includeusingnamespacestd;typedefvectorA;boolface_cmp(constA*x,constA*y){returnx!=y;}intmain(intargc,char*argv[]){vectorvec;for(inti=0;i(i%100,i*i));}vector::iteratorit;sort(vec.begin(),vec.end(),face_cmp);returnEXI

c++ - std::sort() 和 std::sort_heap() 的内存复杂度是多少?

如标题-std::sort()和std::sort_heap()的内存复杂度是多少?(后者需要std::make_heap()所以我也想知道它的内存复杂度。)我尝试在这些网站上搜索:http://www.cplusplus.com/reference/http://en.cppreference.com/w/但要么我错过了,要么他们只提到了时间复杂度。上述函数的内存复杂性是否在任何地方指定(在C++标准或其他文档中)?或者这可能取决于实现? 最佳答案 对于std::sort()我在Cboard上找到了一个答案,它几乎是这样说的:Qu

c++ - Placement-new 与 gcc 4.4.3 严格别名规则

我有一些代码,多年来我一直在成功使用这些代码来实现“变体类型对象”;也就是说,一个C++对象可以保存各种类型的值,但只使用(大约)尽可能多的内存作为最大的可能类型。该代码在本质上类似于标记union,只是它也支持非POD数据类型。它通过使用char缓冲区、放置新/删除和reinterpret_cast来实现这一魔力。我最近尝试在gcc4.4.3(使用-O3和-Wall)下编译这段代码,并收到很多这样的警告:warning:dereferencingtype-punnedpointerwillbreakstrict-aliasingrules根据我的阅读,这表明gcc的新优化器可能会生成

c++ - std::sort by unary 映射

C++标准库提供了将比较器传递给std::sort的功能.但是,我的代码中有很多情况需要对T的列表进行排序。函数对象f.像这样的比较器将是一个有效的选择:boolcompare(constT&a,constT&b){returnf(a)虽然这不是最优的。f评估速度很慢,但每次使用相同的T调用都会返回相同的值目的。所以我宁愿做的是计算f对范围内的每个对象一次,然后使用这些结果对它们进行排序。我的目标是编写这个函数(我没能做到):templatevoidsort(IterTleft,IterTright,Transformationf){/*?*/}在这次通话之后,f(*iter)对于所有