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

Sorting a vector of objects with std::sort()

本文关键字:向量 排序 对象 std sort 使用      更新时间:2023-10-16

我有以下结构:

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 进行排序。事后检查,矢量已排序,但似乎std::vector<intVec> Power的内容已更改。此外,std::sort()std::stable_sort()似乎以不同的方式改变了它们。可能是什么原因造成的?

编辑:IntVec的定义:

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

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

如果没有SSCCE,很难说出你的代码出了什么问题,但看起来你被一个过时的库(blitz++)中的类抓住了,这个库似乎在几年前就停止了进一步的开发/更新/调试。

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

typedef std::vector<int> intVec;

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