QPair 就和 C++ 里的 Pair 用法差不多.
Pair类型概述
pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下:
pair
表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的,如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化。
typedef pair<string, string> author;
author pro("May", "Lily");
author joye("James", "Joyce");
类模板:
template
参数:class T1是第一个值的数据类型,class T2是第二个值的数据类型。
功能:pair将一对值(可以是不同的数据类型)组合成一个值,两个值可以分别用pair的两个公有函数first和second访问。
具体用法:
pair<int,string>p1;
//使用默认构造函数
pair<int,double>p2(1,2.4);
//用给定值初始化
pair<int,double>p3(p2);
//拷贝构造函数
2、通过pair的两个公有函数first和second访问两个元素
pair<int,double>p1;
p1.first=1;
p1.second=2.4;
cout<<p1.first<<endl;
3、赋值(make_pair,变量间赋值,生成新的pair对象 )
//make_pair
pair<int,double>p1;
p1=make_pair(1,2.4);
//变量间赋值
pair<int ,double>p1(1,2.4);
pair<int,double>p2=p1;
//生成新的pair对象
//可以使用make_pair对已存在的两个数据构造一个新的pair类型
int a=1;
string b="sddgds";
pair<int ,string>c;
c=make_pair(a,b);
QMap是Qt的一个模板类,它是基于红黑树算法的一套字典。
QMap
/* 创建QMap实例, 第一个参数为QString类型的键,第二个参数为int类型的值 */
QMap<QString, int> map;
/* 插入数据 两种方式*/
map["math"] = 100;
map.insert("English", 99);
//打印输出: QMap((“English”, 99)(“math”, 100))
/* 移除数据 */
map.remove("math");
//打印输出:QMap((“English”, 99))
/* 遍历数据 (先随便插入几个)*/
map.insert("Math", 100);
map.insert("Chinese", 98);
map.insert("physical", 97);
map.insert("chemical", 96);
map.insert("biological", 95);
/* 遍历数据要使用迭代器,QT提供了两种方式的迭代 */
/* 第一种是Java类型的迭代 */
QMapIterator<QString, int> iterator(map);
while (iterator.hasNext()) {
iterator.next();
qDebug() << iterator.key() << ":" << iterator.value();
}
/* 第二种是STL类型的迭代 */
QMap<QString, int>::const_iterator iterator_1 = map.constBegin();
while (iterator_1 != map.constEnd()) {
qDebug() << iterator_1.key() << ":" << iterator_1.value();
++iterator_1;
}
/*打印输出:两种方法输出一样
“Chinese” : 98
“English” : 99
“Math” : 100
“biological” : 95
“chemical” : 96
“physical” : 97*/
/*由键查找对应键值*/
map.value("Math");
/*由键值查找键*/
map.key(100);
/*修改键值*/
/* 通常一个键只对应一个值,如果再次调用insert()方法,会覆盖以前的值 */
map.insert("Math", 120);
/*查找是否包含某个键*/
bool isok = map.contains("Math");
/*获取所有的键*/
QList<int> allKeys = map.values();
/*获取所有的键值*/
QList<int> allValues = map.values();
/*1键对应多值*/
/* 使用QMultiMap类来实例化一个QMap对象 */
QMultiMap<QString, QString> multiMap;
multiMap.insert("People", "Name");
multiMap.insert("People", "Gender");
multiMap.insert("People", "Age");
multiMap.insert("People", "Height");
multiMap.insert("People", "Weight");
QMapIterator 类 为 QMap 类 以及 QMultiMap类 提供Java风格的常亮迭代器。
QMap既有java风格迭代器又有STL风格迭代器。java风格比STL风格的迭代器更高级也更容易使用;另一方面,java风格迭代器效率略低。
QMapIterator
如果希望在迭代时修改该映射内容,请使用QMutableMapIterator类。
QMapIterator构造函数用QMap 作为参数。在构造之后,迭代器定位在映射的最开始(在第一个项目之前)。下面是迭代器如何顺序遍历所有元素的:
QMap<int, QWidget *> map;
QMapIterator<int, QWidget *> i(map);
while (i.hasNext()) {
i.next();
qDebug() << i.key() << ": " << i.value();
}
next() 返回映射中下一个项目 并且向前推进一步迭代器。 key() and value() 返回被跳过的最近项目的键和值。
遍历方式可以查看上面QMap中提到的两种迭代方式的代码。
注:
可以在同一映射上使用多个迭代器。如果在QMapIterator活动时映射被修改,QMapIterator将继续在原始映射上迭代,忽略修改后的副本