• QPair的介绍及用法


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

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

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

      例如:

      1. QPair<int, QString> p1; // 创建一个空的QPair对象
      2. QPair<int, QString> p2(1, "Hello"); // 创建一个QPair对象,其中first1,second为"Hello"
      3. QPair<int, QString> p3(p2); // 创建一个QPair对象,从p2复制数据
      4. 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 &other):交换当前对象和另一个QPair对象other的数据。
      • operator=、operator==、operator!=、operator<、operator<=、operator>、operator>=:分别表示赋值、相等、不等、小于、小于等于、大于、大于等于操作,注意先比较first,如果相同则再比较second。
      • operator>>和operator<<:分别表示从数据流中读取和写入QPair对象,注意需要对T1和T2实现重载>>和<<。

      例如:

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

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

      例如:

      1. // 定义一个函数,返回两个整数的最大公约数和最小公倍数
      2. QPair<int, int> gcdAndLcm(int a, int b) {
      3. int gcd = 1; // 最大公约数
      4. int lcm = a * b; // 最小公倍数
      5. for (int i = 2; i <= qMin(a, b); i++) {
      6. if (a % i == 0 && b % i == 0) {
      7. gcd = i; // 更新最大公约数
      8. lcm = lcm / i; // 更新最小公倍数
      9. }
      10. }
      11. return QPair<int, int>(gcd, lcm); // 返回一对值
      12. }
      13. // 定义一个结构体,表示学生的姓名和成绩
      14. struct Student {
      15. QString name;
      16. int score;
      17. };
      18. // 定义一个比较函数,按照成绩降序排序,如果成绩相同则按照姓名升序排序
      19. bool compare(const Student &s1, const Student &s2) {
      20. return qMakePair(-s1.score, s1.name) < qMakePair(-s2.score, s2.name);
      21. }
      22. int main() {
      23. // 调用函数,获取两个整数的最大公约数和最小公倍数
      24. QPair<int, int> result = gcdAndLcm(12, 18);
      25. qDebug() << "GCD:" << result.first << "LCM:" << result.second;
      26. // 创建一个QMap容器,存储国家和首都的对应关系
      27. QMap<QString, QString> countries;
      28. countries.insert("China", "Beijing");
      29. countries.insert("Japan", "Tokyo");
      30. countries.insert("USA", "Washington");
      31. // 遍历QMap容器,输出每个QPair元素
      32. for (QPair<QString, QString> pair : countries) {
      33. qDebug() << pair.first << "->" << pair.second;
      34. }
      35. // 创建一个QList容器,存储学生的姓名和成绩
      36. QList<Student> students;
      37. students.append({"Alice", 90});
      38. students.append({"Bob", 85});
      39. students.append({"Cindy", 95});
      40. students.append({"David", 85});
      41. // 使用qSort算法,按照比较函数排序
      42. qSort(students.begin(), students.end(), compare);
      43. // 遍历QList容器,输出每个学生的信息
      44. for (Student s : students) {
      45. qDebug() << s.name << s.score;
      46. }
      47. return 0;
      48. }

      输出:

      1. GCD: 6 LCM: 36
      2. China -> Beijing
      3. Japan -> Tokyo
      4. USA -> Washington
      5. Cindy 95
      6. Alice 90
      7. Bob 85
      8. David 85

    参考资料:

  • 相关阅读:
    v-bind指令的详细介绍
    JavaScript 语法基础
    重新整理 .net core 实践篇 ———— dotnet-dump [外篇]
    JVM进阶(1)
    粒子群算法及其Python实现
    MongoDB副本集调整节点
    文心一言 VS 讯飞星火 VS chatgpt (82)-- 算法导论8.1 1题
    【博客500】k8s调度器如何为pod计算最终得分
    SSM 尚筹网 Vue3 + Vite + Java
    从零开始学习Linux(1)
  • 原文地址:https://blog.csdn.net/future_ai/article/details/134473843