QPair,QMap与QMapIterator的使用方法

QPair:

QPair 就和 C++ 里的 Pair 用法差不多.

Pair类型概述
pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下:
pair a;
表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的,如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化。

typedef pair<string, string> author;
author pro("May", "Lily");
author joye("James", "Joyce");

类模板:
template struct pair
参数: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

QMap是Qt的一个模板类,它是基于红黑树算法的一套字典。
QMap是Qt容器类型的一种,它通过(Key, value)存储一对值,并通过Key可以查找与之关联的value的值。

/* 创建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 类

QMapIterator 类 为 QMap 类 以及 QMultiMap类 提供Java风格的常亮迭代器。

QMap既有java风格迭代器又有STL风格迭代器。java风格比STL风格的迭代器更高级也更容易使用;另一方面,java风格迭代器效率略低。

QMapIterator 允许你对 QMap 或者 QMultiMap进行迭代。(所谓了迭代,说白了就是对一个 QMap类的容器进行一定顺序的遍历,可以看到里面的每一个内容(内容可以是QMap类的首地址等))。

如果希望在迭代时修改该映射内容,请使用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() 返回被跳过的最近项目的键和值。QPair,QMap与QMapIterator的使用方法_第1张图片
遍历方式可以查看上面QMap中提到的两种迭代方式的代码。

注:
可以在同一映射上使用多个迭代器。如果在QMapIterator活动时映射被修改,QMapIterator将继续在原始映射上迭代,忽略修改后的副本

你可能感兴趣的:(qt)