我在排序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);
答案 0 :(得分:6)
首先,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
有关详细信息,请参阅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
<