如何对用户定义类型的非常大的向量进行排序

Posted

技术标签:

【中文标题】如何对用户定义类型的非常大的向量进行排序【英文标题】:How to sort a very large vector of user defined type 【发布时间】:2013-08-12 06:37:42 【问题描述】:

我想对大量像素进行排序。

typedef char HexGetal;
typedef unsigned int NatuurlijkGetal;

struct  Pixel
    HexGetal Blue;
    HexGetal Green;
    HexGetal Red;
;
struct Palet   
    Pixel Kleur;
    NatuurlijkGetal Aantal; 
;
    vector <Palet> MyContainer;

    NatuurlijkGetal Seeds[10]=1, 25, 55, 7, 3, 149, 6, 7, 1, 55;


    Palet LoopPalet;


    LoopPalet.Kleur.Blue = 0;
    LoopPalet.Kleur.Green = 0;
    LoopPalet.Kleur.Red = 0;


    for(NatuurlijkGetal Looper = 0; Looper < 10;Looper++)
    
        LoopPalet.Aantal = Seeds[Looper];
        MyContainer.push_back(LoopPalet);
    

在创建类型“Palet”之后,我创建了一个名为“MyContainer”的 Palet 向量,并对其进行初始化。

现在我想根据“Aantal”字段对其进行排序。 我怎么做?我可能正在寻找两种不同的方法。

第 1 部分: 我想学习当向量很小时执行此操作的一般方法。我从未对向量进行排序。阅读了很多关于它的内容并观看了视频,但我就是不明白。

第 2 部分: 以后使用时,此向量将具有超过 100 万个元素。所以也许需要一种更聪明的方法来限制复制操作的数量。

提前致谢。

【问题讨论】:

尝试使用自定义比较器 std::sort。如果测量速度太慢,请查看其他内容。 我在发布之前尝试了 std::sort ,但无法让它工作,因为我不知道在这种情况下自定义比较器会是什么样子。正如我所说,以前从未做过这样的事情。 【参考方案1】:
struct mycomp

     bool operator() (const Palet& p1, const Palet& p2)
    
        return (p1.Aantal < p2.Aantal); //Change the operator as required
    
;

std::sort(MyContainer.begin(), MyContainer.end() , mycomp());

【讨论】:

@MehmetElliyasa 欢迎使用 ***。在 SO 中,当您认为某个答案正确或有用时,请点赞。 SO中的问题不仅是为问题的OP设计的,而且是为所有搜索类似问题并发现这个问题的人回答的问题。 Upvotes 反映了哪些是好的答案,哪些不是。最后,如果您认为某个答案解决了您的问题(如本例所示),请将其标记为您的问题的答案(答案的绿色标记)。 您的操作员应该是const。如果您尝试使用非常量的标准库,某些标准库实现可能会失败。 在Palet中定义operator @ZanLynx(虽然这已经有效)你的听起来也很有趣......如果它只有 1 或 2 行......你能告诉我你的意思吗? @Manu343726 我尝试将功劳归功于其他好的答案,但不能,因为它需要至少 15 名声望。所以我想我得等一会再给他们功劳。【参考方案2】:

只需使用std::sort。我在运行接近 2GB 进程限制的程序中使用过。 “一百万”个元素可能听起来很多,但在 8 个字节时仍然只有 8 MB。它甚至可能适合缓存。

【讨论】:

【参考方案3】:

我个人会使用std::sort 或类似名称,但我不会直接在std::vector 中对大型元素进行排序。我会用比较器对我的大元素的引用进行排序。每个引用都是一个简单的容器,带有一个指向大元素的智能指针。

您还可以考虑将std::map 用作一个容器,它会自动为您提供排序序列。

【讨论】:

-1 std::sort 不仅用于对向量进行排序。使用迭代器模式设计,也就是说,它对由初始迭代器和最终迭代器定义的任何区间进行排序。如果您在很棒的非 std::vector 容器中定义了 begin()end() 迭代器,则可以将其与 std::sort 一起使用。 对不起,我认为您不理解这个想法。我不建议用自定义容器替换 std::vector 。我建议将对大元素的引用包装在容器中,然后对引用进行排序。 如果您的大数据类是可移动的,则不需要包装。搬家很便宜。当然,如果您可以访问 C++11 功能。

以上是关于如何对用户定义类型的非常大的向量进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何对 <class*> 类型的向量进行排序? [复制]

用于对包含指向自定义类对象的指针的向量进行排序的比较器

我如何按类属性对C++向量数组进行排序[重复]

根据另一个不同大小和类型的向量对点向量进行排序

使用lambda函数进行向量排序,当不在同一范围内时如何传递变量来捕获组?

使用自定义排序对向量进行排序