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

时间:2014-10-23 10:25:40

标签: c++ qt sorting qtcore qlist

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

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'和'const modelHeuristic :: Saving')          return(t1&lt; t2);

2 个答案:

答案 0 :(得分:6)

首先,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

有关详细信息,请参阅documentation

答案 1 :(得分:3)

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

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

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

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

根据您的sortin规则实施operator <

typedef struct {

     QString c;
     QString t;
     double value;
 } Saving;

 bool operator < (const Saving &s1, const Saving &s2) {
     /*Your comparsion code */ 
 }

这是编译器告诉你的:

  

错误:二进制表达式的无效操作数('const modelHeuristic :: Saving'和'const modelHeuristic :: Saving')返回(t1&lt; t2);

无法使用Saving

比较两个<