QList 按结构体的某个属性排序

本文详细介绍了一种使用C++对自定义类对象列表进行排序的方法,包括三种不同的实现方式:使用lambda表达式、自定义比较函数和冒泡排序算法。通过具体实例展示了如何根据对象的特定属性(如meetTime)对QList进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

举例:按照meetTime属性的时间从小到大排序

 

class test
{

public:

    QDateTime meetTime;
    int num;


};

 

写法1:

      QList<test> temp_list;
     test aa;
     test bb;
     test cc;
    
     cc.meetTime = QDateTime().fromString("2019-11-11 20:20:20.222","yyyy-MM-dd hh:mm:ss.zzz");
     cc.num=1;

     bb.meetTime = QDateTime().fromString("2019-11-11 20:20:21.222","yyyy-MM-dd hh:mm:ss.zzz");
     bb.num=2;

     aa.meetTime = QDateTime().fromString("2019-11-11 20:20:22.222","yyyy-MM-dd hh:mm:ss.zzz");
     aa.num=3;

     temp_list.append(aa);
     temp_list.append(bb);
     temp_list.append(cc);
     for(int i = 0; i < temp_list.count() ; i++)
     { qDebug() << temp_list.at(i).num; }
   
     qSort(temp_list.begin(), temp_list.end(),[](const test &infoA,const test &infoB){return infoA.meetTime < infoB.meetTime;});


     for(int i = 0; i < temp_list.count() ; i++)
     { qDebug() << temp_list.at(i).num<<temp_list.at(i).meetTime.toString("yyyy-MM-dd hh:mm:ss.zzz"); }

////////////////////////////////////////////////////////////////////////////////////////////////

写法2:

 int compare(const test &infoA,const test &infoB)
{
    return infoA.meetTime < infoB.meetTime;
}

 

QList<test> temp_list;
     test aa;
     test bb;
     test cc;
    
     cc.meetTime = QDateTime().fromString("2019-11-11 20:20:20.222","yyyy-MM-dd hh:mm:ss.zzz");
     cc.num=1;

     bb.meetTime = QDateTime().fromString("2019-11-11 20:20:21.222","yyyy-MM-dd hh:mm:ss.zzz");
     bb.num=2;

     aa.meetTime = QDateTime().fromString("2019-11-11 20:20:22.222","yyyy-MM-dd hh:mm:ss.zzz");
     aa.num=3;

     temp_list.append(aa);
     temp_list.append(bb);
     temp_list.append(cc);
     for(int i = 0; i < temp_list.count() ; i++)
     { qDebug() << temp_list.at(i).num; }
   
     qSort(temp_list.begin(), temp_list.end(),compare);


     for(int i = 0; i < temp_list.count() ; i++)
     { qDebug() << temp_list.at(i).num<<temp_list.at(i).meetTime.toString("yyyy-MM-dd hh:mm:ss.zzz"); }

 

////////////////////////////////////////////////////////////////////////////////////////////////

写法3:

QList<test> temp_list;
     test aa;
     test bb;
     test cc;
    
     cc.meetTime = QDateTime().fromString("2019-11-11 20:20:20.222","yyyy-MM-dd hh:mm:ss.zzz");
     cc.num=1;

     bb.meetTime = QDateTime().fromString("2019-11-11 20:20:21.222","yyyy-MM-dd hh:mm:ss.zzz");
     bb.num=2;

     aa.meetTime = QDateTime().fromString("2019-11-11 20:20:22.222","yyyy-MM-dd hh:mm:ss.zzz");
     aa.num=3;

     temp_list.append(aa);
     temp_list.append(bb);
     temp_list.append(cc);
     for(int i = 0; i < temp_list.count() ; i++)
     { qDebug() << temp_list.at(i).num; }
   
    for( int i=0; i<temp_list.count()-1; i++ ){
         test icondition = temp_list.at(i);
         for( int j=i+1; j<temp_list.count(); j++ ){
             test jcondition = temp_list.at(j);
             if( icondition.meetTime>jcondition.meetTime ){
                 temp_list.swap( i, j );
             }
         }
    }


     for(int i = 0; i < temp_list.count() ; i++)
     { qDebug() << temp_list.at(i).num<<temp_list.at(i).meetTime.toString("yyyy-MM-dd hh:mm:ss.zzz"); }

 

 

这三种写法会得到相同的排序结果:

 

### 关于 Qt 中 `QList` 的 `swap` 方法 #### 方法概述 `QList` 是 Qt 提供的一种动态数组容器,用于存储任意类型的对象列表。它支持多种操作方法,其中包括高效的交换操作——`swap` 方法。该方法允许两个 `QList` 对象的内容快速互换,而无需复制数据[^3]。 #### 使用方式 `QList` 的 `swap` 方法可以通过以下方式进行调用: ```cpp void QList<T>::swap(QList<T> &other); ``` 此方法接受另一个 `QList` 对象作为参数,并将其内容与当前列表的内容进行交换。由于 `QList` 实现了隐式共享机制(Implicit Sharing),因此即使在多线程环境中,这种方法也能高效运行并保持线程安全性[^3]。 #### 示例代码 以下是使用 `swap` 方法的一个简单示例: ```cpp #include <QList> #include <QDebug> int main() { QList<int> list1 = {1, 2, 3}; QList<int> list2 = {4, 5, 6}; qDebug() << "Before Swap:"; qDebug() << "list1:" << list1; qDebug() << "list2:" << list2; // 调用 swap 方法 list1.swap(list2); qDebug() << "After Swap:"; qDebug() << "list1:" << list1; qDebug() << "list2:" << list2; return 0; } ``` 输出结果如下: ``` Before Swap: list1: (1, 2, 3) list2: (4, 5, 6) After Swap: list1: (4, 5, 6) list2: (1, 2, 3) ``` 通过上述代码可以看出,`swap` 方法能够迅速完成两者的数据交换,而不涉及任何深拷贝操作[^3]。 #### 实现细节 `QList` 的内部实现基于一种称为 **pimpl idiom** 的技术,即指针到实现模式。这种设计使得 `swap` 操作仅需交换指向底层数据结构的指针即可完成,从而极大地提高了效率[^3]。 具体来说,在隐式共享机制下,当一个 `QList` 对象与其他对象共享同一份数据时,只有在其内容发生更改时才会触发深拷贝(Copy-On-Write)。而在执行 `swap` 操作时,不会破坏这种共享状态,而是直接调整所有权归属[^3]。 #### 性能优势 相比传统的逐项赋值或其他复杂的数据转移手段,`swap` 方法具有显著的优势: - 时间复杂度为 O(1),因为只涉及到少量指针的操作; - 不会引发额外内存分配或释放行为; - 非常适合大规模数据集之间的交互场景[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值