使用 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<intVec>
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<>
的定义,要么将其抽象出来。
【参考方案1】:
如果没有 SSCCE,很难判断您的代码有什么问题,但您似乎被一个过时库 (blitz++) 中的类所吸引,该库似乎已停止进一步开发/更新/调试几年以前。
由于blitz::Array<int,1>
是一个动态分配的一维整数数组,因此当您获得完全支持(正确交换)和 C++11 功能(移动语义)时,谨慎使用 std::vector<int>
没有任何优势。所以,首先要尝试的是
typedef std::vector<int> intVec;
并查看症状是否持续存在。如果这涉及对您的代码进行太多更改,请先使用 SSCCE 尝试此操作(最初必须显示与您的代码相同的症状)。
【讨论】:
我要试试这个,但这需要我一段时间。它需要我更改很大一部分代码,因此我无法立即查看它是否有效。谢谢! @RobVerheyen 不应该要求您进行很多更改:这是一个简单的typedef
。你还需要改变什么?而为了测试这个问题,你只需要编译几个文件。此外,您可以在提交更改所有代码之前生成 SSCCE 并在那里进行更改。
您可能是对的,但这是完全摆脱使用 Blitz 库的好机会。我在代码的很多其他地方都用到了它,更具体地说,对象中的 intVecs 是通过使用其他 intVecs/其他 Blitz 类型的方法创建的,所以我不妨全部替换掉。以上是关于使用 std::sort() 对对象向量进行排序的主要内容,如果未能解决你的问题,请参考以下文章
使用 std::sort 对包含两个数据成员的对象向量进行排序
C++ - 使用 std::sort 对结构向量进行排序导致读取访问冲突