需求:
QMap是Qt的一个关联式容器,可以用于存储键值对,并提供了快速的查找和访问方式。当我们向QMap中插入元素时,默认按照键值对的大小升序排序。
如果我们现在有一个这样一个需求,QMap<QString, double> map,存储的数据为名字对应值,如:(apple, 12.2),(orange, 23.3),(banana, 10.5)。 现在需要按照map元素值的升序的顺序获取QMap中的所有元素,也就是希望获得的结果是: (banana, 10.5),(apple, 12.2),(orange, 23.3)。
思路:
std::sort()可以实现对容器排序,但是无法对QMap使用std::sort()。我们可以先将QMap中的元素放入到QVector,然后再对QVector进行排序,最终获得排序后的数据。
实现:
QMap<QString, double> testMap;
testMap.insert("apple", 12.2);
testMap.insert("banana", 10.5);
testMap.insert("orange", 23.3);
// 数据转入QVector
QVector<QPair<QString, double>> fruit;
for (auto it = testMap.begin(); it != testMap.end(); ++it)
{
QPair<QString, double> temp(it.key(), it.value());
fruit.append(temp);
}
qDebug() << "sort之前" << fruit;
std::sort(fruit.begin(), fruit.end(), [](QPair<QString, double> ele1, QPair<QString, double> ele2){
return ele1.second < ele2.second;
});
qDebug() << "sort之后" << fruit;
排序的关键在于qSort第三个参数的编写,它是一个匿名函数,用来判断元素的大小。 为了方便,这里使用了lambda表达式。代码输出结果:
根据这个思路,同样的我们可以排序一个结构体:
struct stu_Point
{
double fPointX; // X坐标
double fPointY; // Y坐标
double fPointValue; // 坐标值
stu_Point(double x, double y, double value)
:fPointX(x),
fPointY(y),
fPointValue(value)
{}
};
QVector<stu_Point> point;
stu_Point point1(1.3, 1.3, 12.2);
stu_Point point2(1.1, 1.1, 10.5);
stu_Point point3(1.5, 1.5, 23.3);
point.append(point1);
point.append(point2);
point.append(point3);
qDebug() << "sort之前 ";
foreach (auto var, point) {
qDebug() << var.fPointValue;
}
std::sort(point.begin(), point.end(), [](stu_Point ele1, stu_Point ele2){
return ele1.fPointValue < ele2.fPointValue;
});
qDebug() << "sort之后 ";
foreach (auto var, point) {
qDebug() << var.fPointValue;
}