[英]How to sort QList<MyClass*> using Qt library (maybe 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<
。 我更喜歡明確,特別是從那以后你可以將你的比較限制在它所依賴的類中。
因此,我會寫這樣的東西:
#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;
}
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.