使用 std::sort() 对对象向量进行排序

Posted

技术标签:

【中文标题】使用 std::sort() 对对象向量进行排序【英文标题】:Sorting a vector of objects with std::sort() 【发布时间】:2014-01-12 16:49:42 【问题描述】:

我有以下结构:

struct Invariant

public:
    Invariant(int d, int dc)
    : Dim(d), DimCoupl(dc) 
    void addTerm(int coeff, intVec pows)
    
        Powers.push_back(pows);
        Coefficients.push_back(coeff);
    

    int Dim, DimCoupl;
    std::vector<long> Coefficients;
    std::vector<intVec> Powers;
;

IntVec 是一个自定义的整数数组,它基于 Boost 库中的数组。

我有这些对象的 stl 向量,我想按它们的系数向量的元素数量对它们进行排序。所以我定义:

bool compInv(const Invariant &one, const Invariant &two)

    return (one.Coefficients.size() < two.Coefficients.size());

并使用std::sort()std::stable_sort() 对Vector 进行排序。之后检查,Vector 已排序,但似乎std::vector&lt;intVec&gt; Powers 的内容已更改。此外,std::sort()std::stable_sort() 似乎以不同的方式改变它们。这可能是什么原因造成的?

编辑:IntVec 的定义:

typedef blitz::Array<int,1> intVec;

我使用它是因为它们比常规数组更容易初始化,这非常重要,因为我必须创建很多这些对象,每个对象都包含很多这些向量。

【问题讨论】:

如果发生这种情况,那么你的intVec 类(尤其是它的swap 或赋值运算符)就坏了。为什么要自己滚动? 我认为std::sort 使用std::swap。可能是交换您的 IntVec 并没有按照您的想法进行(即您的 IntVec 课程已损坏)。 我添加了intVec的定义。如果有帮助,我将编辑 sort() 函数的结果。 答案是:不要使用 blitz++。它不再更新/调试;它永远不会利用/支持更新的 C++ 标准(如当前的 2011 标准)。它的在线文档日期为 2006 年 3 月:超过 7 年。 @RobVerheyen:这还不够。它是不可重现的。 typedef 根本没有用。要么提供blitz:Array&lt;&gt; 的定义,要么将其抽象出来。 【参考方案1】:

如果没有 SSCCE,很难判断您的代码有什么问题,但您似乎被一个过时库 (blitz++) 中的类所吸引,该库似乎已停止进一步开发/更新/调试几年以前。

由于blitz::Array&lt;int,1&gt; 是一个动态分配的一维整数数组,因此当您获得完全支持(正确交换)和 C++11 功能(移动语义)时,谨慎使用 std::vector&lt;int&gt; 没有任何优势。所以,首先要尝试的是

typedef std::vector<int> intVec;

并查看症状是否持续存在。如果这涉及对您的代码进行太多更改,请先使用 SSCCE 尝试此操作(最初必须显示与您的代码相同的症状)。

【讨论】:

我要试试这个,但这需要我一段时间。它需要我更改很大一部分代码,因此我无法立即查看它是否有效。谢谢! @RobVerheyen 不应该要求您进行很多更改:这是一个简单的typedef。你还需要改变什么?而为了测试这个问题,你只需要编译几个文件。此外,您可以在提交更改所有代码之前生成 SSCCE 并在那里进行更改。 您可能是对的,但这是完全摆脱使用 Blitz 库的好机会。我在代码的很多其他地方都用到了它,更具体地说,对象中的 intVecs 是通过使用其他 intVecs/其他 Blitz 类型的方法创建的,所以我不妨全部替换掉​​。

以上是关于使用 std::sort() 对对象向量进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::sort 对包含两个数据成员的对象向量进行排序

使用 std::sort 对具有特定标准的二维向量进行排序

C++ - 使用 std::sort 对结构向量进行排序导致读取访问冲突

如何使用 std::sort() 对指向值的向量进行排序?

std::sort 对包含 Objects* 指针的 Objects 向量进行排序

如何使用单独类的属性对向量进行 std::sort [关闭]