QMap或结构体根据value排序

20 篇文章 10 订阅

需求:       

        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;
}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值