如何在QList中对自定义类型使用qSort

How to use qSort with custom types in QList?

本文关键字:类型 qSort 自定义 QList      更新时间:2023-10-16

我对包含struct:实例的QList进行排序时遇到问题

class modelHeuristic
{
    typedef struct {
         QString c;
         QString t;
         double value;
     }Saving;
public:
QList<Saving> list_saving;
#include "klarkeright.h"
klarkeRight::klarkeRight()
{

}
void klarkeRight::Algoritmo_Asimetrico(modelHeuristic *model)
{
    qSort(model->list_saving.begin(), model->list_saving.end());
}

错误:二进制表达式的操作数无效("const modelHeuristic::Saving"answers"const model Heuristic::Saving")return(t1<t2);>

首先,QtAlgorithms大多被弃用,您不应该使用它。请按照Qt文档的建议使用std::sort。

否则,您将需要实现实际的比较功能,因为您似乎在使用自定义类型。自然,通用算法不知道如何与这样的自定义项进行比较。这就是错误试图表明的。

然后,您需要将该函数作为第三个参数传递给排序算法,或者将其命名为operator<。我更喜欢明确,尤其是从那时起,你可以将你的比较限制在它所绑定的类上。

因此,我会写这样的东西:

main.cpp

#include <QtAlgorithms>
#include <QString>
#include <QList>
class modelHeuristic
{
    typedef struct {
        QString c;
        QString t;
        double value;
    } Saving;
    public:    
        static bool savingComparison(const Saving &s1, const Saving &s2)
        {
            return s1.value < s2.value; // This is just an example
        }
        QList<Saving> list_saving;
};
int main()
{
    modelHeuristic *model = new modelHeuristic();
    // This is not doing anything useful with an empty list
    // that is constructed, but it shows how to get the theory right!
    // Also, you really wish to use std::sort here instead.
    qSort(model->list_saving.begin(), model->list_saving.end(), modelHeuristic::savingComparison);
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp

构建并运行

qmake && make && ./main

有关详细信息,请参阅文档。

要执行排序,通常需要对要排序的元素进行一些排序。如果您没有一个机制来告诉哪个元素在另一个元素之前,则无法对列表进行排序。

qSort(和大多数其他排序算法)使用operator <来比较元素。您没有指定这样的运算符。

编译器(或任何人)应该如何知道一个Saving是否应该放在另一个Saving对象之前?

Saving {"Test", "foo", 1.2}Saving {"bar", "baz", 1000000}之前吗?

根据您的分拣规则实施operator <

typedef struct {
     QString c;
     QString t;
     double value;
 } Saving;
 bool operator < (const Saving &s1, const Saving &s2) {
     /*Your comparsion code */ 
 }

这就是你的编译器告诉你的:

错误:二进制表达式的无效操作数("const modelHeuristic::Saving"answers"const model Heuristic::Saving")返回(t1<t2);

它无法使用< 比较两个Saving