QPair的介绍及用法

QPair是一个模板类,它存储一对值(key,value),可以是不同的数据类型。QPair的用法有以下几个方面:

  • QPair的构造函数有以下几种形式:

    • QPair():默认构造函数,创建一个空的QPair对象。
    • QPair(QPair<TT1, TT2> &&p):移动构造函数,从另一个QPair对象p移动数据到当前对象。
    • QPair(const QPair<TT1, TT2> &p):拷贝构造函数,从另一个QPair对象p复制数据到当前对象。
    • QPair(const T1 &value1, const T2 &value2):创建一个QPair对象,其中first为value1,second为value2。

    例如:

    QPair<int, QString> p1; // 创建一个空的QPair对象
    QPair<int, QString> p2(1, "Hello"); // 创建一个QPair对象,其中first为1,second为"Hello"
    QPair<int, QString> p3(p2); // 创建一个QPair对象,从p2复制数据
    QPair<int, QString> p4(std::move(p2)); // 创建一个QPair对象,从p2移动数据
    
  • QPair的常用接口有以下几种:

    • first和second:分别表示QPair对象中的第一个值和第二个值,可以直接访问和修改。
    • qMakePair(const T1 &value1, const T2 &value2):创建一个QPair对象,其中first为value1,second为value2,等同于QPair(value1, value2)。
    • swap(QPair<T1, T2> &other):交换当前对象和另一个QPair对象other的数据。
    • operator=、operator==、operator!=、operator<、operator<=、operator>、operator>=:分别表示赋值、相等、不等、小于、小于等于、大于、大于等于操作,注意先比较first,如果相同则再比较second。
    • operator>>和operator<<:分别表示从数据流中读取和写入QPair对象,注意需要对T1和T2实现重载>>和<<。

    例如:

    QPair<int, QString> p1(1, "Hello");
    QPair<int, QString> p2 = qMakePair(2, "World"); // 等同于QPair<int, QString> p2(2, "World");
    p1.first = 3; // 修改p1的第一个值为3
    p1.second = "Qt"; // 修改p1的第二个值为"Qt"
    p1.swap(p2); // 交换p1和p2的数据
    bool b1 = (p1 == p2); // 判断p1和p2是否相等,即first和second都相等
    bool b2 = (p1 < p2); // 判断p1是否小于p2,即先比较first,如果相同则再比较second
    QDataStream ds;
    ds << p1; // 将p1写入数据流
    ds >> p2; // 从数据流中读取p2
    
  • QPair的常见用法有以下几种:

    • 作为函数的返回值,可以返回两个相关的值,而不需要定义一个结构体或类。
    • 作为容器的元素,可以存储键值对,例如QMap、QHash、QList等。
    • 作为算法的参数,可以传递两个相关的值,例如qSort、qStableSort等。

    例如:

    // 定义一个函数,返回两个整数的最大公约数和最小公倍数
    QPair<int, int> gcdAndLcm(int a, int b) {
        int gcd = 1; // 最大公约数
        int lcm = a * b; // 最小公倍数
        for (int i = 2; i <= qMin(a, b); i++) {
            if (a % i == 0 && b % i == 0) {
                gcd = i; // 更新最大公约数
                lcm = lcm / i; // 更新最小公倍数
            }
        }
        return QPair<int, int>(gcd, lcm); // 返回一对值
    }
    
    // 定义一个结构体,表示学生的姓名和成绩
    struct Student {
        QString name;
        int score;
    };
    
    // 定义一个比较函数,按照成绩降序排序,如果成绩相同则按照姓名升序排序
    bool compare(const Student &s1, const Student &s2) {
        return qMakePair(-s1.score, s1.name) < qMakePair(-s2.score, s2.name);
    }
    
    int main() {
        // 调用函数,获取两个整数的最大公约数和最小公倍数
        QPair<int, int> result = gcdAndLcm(12, 18);
        qDebug() << "GCD:" << result.first << "LCM:" << result.second;
    
        // 创建一个QMap容器,存储国家和首都的对应关系
        QMap<QString, QString> countries;
        countries.insert("China", "Beijing");
        countries.insert("Japan", "Tokyo");
        countries.insert("USA", "Washington");
        // 遍历QMap容器,输出每个QPair元素
        for (QPair<QString, QString> pair : countries) {
            qDebug() << pair.first << "->" << pair.second;
        }
    
        // 创建一个QList容器,存储学生的姓名和成绩
        QList<Student> students;
        students.append({"Alice", 90});
        students.append({"Bob", 85});
        students.append({"Cindy", 95});
        students.append({"David", 85});
        // 使用qSort算法,按照比较函数排序
        qSort(students.begin(), students.end(), compare);
        // 遍历QList容器,输出每个学生的信息
        for (Student s : students) {
            qDebug() << s.name << s.score;
        }
    
        return 0;
    }
    

    输出:

    GCD: 6 LCM: 36
    China -> Beijing
    Japan -> Tokyo
    USA -> Washington
    Cindy 95
    Alice 90
    Bob 85
    David 85
    

参考资料:

相关推荐
黄金右肾3 小时前
Qt之数据库使用(十四)
sql·qt·sqlite·database
杨德杰5 小时前
QT多媒体开发(一):概述
qt·音视频·多媒体
小王爱吃月亮糖5 小时前
QT开发【常用控件1】-Layouts & Spacers
开发语言·前端·c++·qt·visual studio
864记忆5 小时前
关于opencv、Qt、msvc编译器之间的关系
人工智能·qt·opencv
矛取矛求12 小时前
QT的前景与互联网岗位发展
开发语言·qt
Leventure_轩先生12 小时前
[WASAPI]从Qt MultipleMedia来看WASAPI
开发语言·qt
晓纪同学1 天前
QT-简单视觉框架代码
开发语言·qt
威桑1 天前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服1 天前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
fyzy1 天前
Qt获取本地计算的CPU温度
qt