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
参考资料:
- QPair使用
- QPair 的用法
- C++ pair的基本用法总结(整理)