簡體   English   中英

如何在QList中使用qSort和自定義類型?

[英]How to use qSort with custom types in QList?

我在排序包含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'和'const modelHeuristic :: 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 {"bar", "baz", 1000000}之前Saving {"Test", "foo", 1.2} Saving {"bar", "baz", 1000000}

實現operator <根據您的sortin規則:

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')return(t1 <t2);

它無法使用<比較兩個Saving s

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM