QMap或结构体根据value排序

需求:       

        QMap是Qt的一个关联式容器,可以用于存储键值对,并提供了快速的查找和访问方式。当我们向QMap中插入元素时,默认按照键值对的大小升序排序。

        如果我们现在有一个这样一个需求,QMap 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 testMap;
testMap.insert("apple", 12.2);
testMap.insert("banana", 10.5);
testMap.insert("orange", 23.3);

// 数据转入QVector
QVector> fruit;
for (auto it = testMap.begin(); it != testMap.end(); ++it)
{
    QPair temp(it.key(), it.value());
    fruit.append(temp);
}

qDebug() << "sort之前" << fruit;
std::sort(fruit.begin(), fruit.end(), [](QPair ele1, QPair 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 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;
}

QMap或结构体根据value排序_第1张图片

 

你可能感兴趣的:(QT,C++,Qt,sort,排序)