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

参考资料:

相关推荐
hqwest19 小时前
码上通QT实战15--监控页面07-打开串口连接
开发语言·qt·多线程·signal·slot·emit·信号和槽
CS Beginner21 小时前
【单片机】嵌入式显示屏开发框架:QT、SDL、LVGL 深度解析
单片机·嵌入式硬件·qt
金色熊族21 小时前
MV结构下设置Qt表格的代理(2)
c++·qt
Morwit21 小时前
Qt qml创建c++类的单例对象
开发语言·c++·qt
YxVoyager1 天前
Qt C++ :QRegularExpression 正则表达式使用详解
c++·qt·正则表达式
qq_401700411 天前
QStackedLayout 实现遮罩层
qt
Larry_Yanan1 天前
Qt多进程(十一)Linux下socket通信
linux·开发语言·c++·qt
weixin_462446231 天前
Python 使用 PyQt5 + Pandas 实现 Excel(xlsx)批量合并工具(带图形界面)
python·qt·pandas
不会c嘎嘎1 天前
QT中的常用控件(五)
服务器·开发语言·qt
一只小bit1 天前
Qt 重要控件:多元素控件、容器类控件及布局管理器
前端·c++·qt