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
    

参考资料:

相关推荐
锦亦之22334 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
柳鲲鹏7 小时前
编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MinGW版)
开发语言·qt·mysql
三玖诶7 小时前
如何在 Qt 的 QListWidget 中逐行添加和显示数据
开发语言·qt
阳光开朗_大男孩儿13 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
Alphapeople14 小时前
Qt Modbus
开发语言·qt
竹林海中敲代码14 小时前
Qt Creator 集成开发环境 常见问题
qt·qt工具常见问题
竹林海中敲代码18 小时前
Qt安卓开发连接手机调试(红米K60为例)
android·qt·智能手机
长沙红胖子Qt19 小时前
关于 Qt运行加载内存较大崩溃添加扩大运行内存 的解决方法
开发语言·qt·qt扩大运行内存
gopher951119 小时前
qt相关面试题
开发语言·qt·面试
三玖诶1 天前
在 Qt 中使用 QLabel 设置 GIF 动态背景
开发语言·qt·命令模式