QT开发STL
容器类
Qt的容器类比STL(标准模板库)种的容器类更轻巧、安全和易于使用。
1 | QList<QString> aList; |
顺序容器通过元素在容器中的位置顺序存储和访问,没有key值概念的
关联容器通过键(key)存储和读取元素(有key值和value是同一个值,set的时候,只能看到一个值,这种就不存在关联;其他都有key值,找到value值)
Qt的容器类分为顺序容器和关联容器
顺序容器:QList(指针),QLinkedList(链表),QVector(对象),QStack(栈)和QQueue(队列)
关联容器QMap(key值不能重复,存储连续),QMultiMap(key值可以重复),QHash(通过hash值算出位置存储),QMultiHash(key值可以重复,)和QSet(key与value值相同,key就是value)
QLis:数组列表
1 | QList<QString> list; |
QLinkedList: 除了不提供下标索引的数据访问,和QList其他函数接口基本相同
QVector : 函数接口与QList几乎完全相同,访问性能更高,因为是连续存储.但是插入和删除不方便
QStack:LIFO
1 | QStack<int> stack; |
Queue:FIFO 先进先出
1 | QQueue<int> queue; |
QSet:
基于散列表,存放位置未知的,存放位置是否为cat,不是,往下存,是的就不再存储了
1 | QSet<QString> set; |
QMap:
按键值的顺序存储(如果插入重复的值,就忽略,键值是唯一的)
1 | QMap<QString,int> map; |
| 运行结果 | ||||
|---|---|---|---|---|
| key: | one | two | three | four |
| value: | 1 | 2->0 | 3 | 4 |
QMultiMap:
QMap的子类,键值可以重复
1 | QMultiMap<QStringint> map1,map2,map3; |
QHash必须提供”==”于QMap用法类似,QMultiHash与QMultiMap用法类似
容器类的迭代3.4
迭代器就是为访问容器里面的数据,提供的一种方法;提供了一种方法对容器进行迭代访问,无需暴露容器的内部结构。迭代器被设计为用于遍历容器内的元素,如数组、列表、映射等。
QT有两种迭代器:java类型的迭代器(易于使用)和STL类型的迭代器(效率高)
Java类型迭代器
| 容器类 | 只读迭代器 | 读写迭代器 |
| QList<T>、QQueue<T> | QListlterator<T> | QMutableListlterator<T> |
| QLinkedList<T> | QLinkedListlterator<T> | QMutableLinkedListlterator<T> |
| QVector<T>、QStack<T> | QVectorlterator<T> | QMutableVectorlterator<T> |
| Qset<T> | QSetiterator<T> | QMutableSetiterator<T> |
| QMap<Key,T>、QMultiMap<Key,T> | QMaplterator<Key,T> | QMutableMaplterator<Key,T> |
| Qhash<Key,T>、QMultiHash<Key,T> | QHashlterator<Key,T> | QMutableHashlterator<Key,T> |
1 | QList<QString> list; |
反向遍历
1 | QListIterator<QString> i(list); |
| 常用函数 | 功能 |
| void toFront() | 迭代器移动到列表的最前面(第一个数据项之前) |
| void toBack() | 迭代器移动到列表的最后面(最后一个数据项之后) |
| bool hasNext() | 如果迭代器不是位于列表最后位置,返回true |
| const T& next() | 返回下一个数据项,并且迭代器后移一个位置 |
| const T&peekNext() | 返回下一个数据项,但是不移动迭代器位置 |
| bool hasPrevious() | 如果迭代器不是位于列表最前面,返回true |
| const T& previous() | 返回前一个数据项,并且迭代器前移一个位置 |
| const T& peekPrevious() | 返回前一个数据项,但是不移动迭代器指针 |
//删除奇数项
1 | QList<int> list; |
容器内数据: 2 4;
关联容器类的迭代器的使用
关联容器上面表中函数都可以使用
具有上表所示的所有函数,主要是增加了key()和value()函数用于获取刚刚跳过的数据项的键和值
1 | QMap<QString,QString> map; |
删除Value是”USA”的项
1 | while(i.findNext("USA")) |
STL类型迭代器
与C++标准类型的迭代器是一样的
| 容器类 | 只读迭代器 | 读写迭代器 |
|---|---|---|
| QList |
QList |
QList |
| QLinkedList |
QLinkedList |
QLinkedList |
| QVector |
QVector |
QVector |
| QSet |
QSet |
QSet |
| QMap<key,T> QMultiMap<key,T> |
QMap<key,T>::const_iterator | QMap<key,T>::iterator |
可以使用const_reverse_iterator和reverse_iterator 定义相应的反向迭代器
reverse:反转、交换、颠倒
STL类型的迭代器是数组的指针,所以”++”运算符使迭代器指向下一个数据项,运算符返回数据项内容
STL迭代器直接指向数据项,尾后的值,不要取值。
begin:开始 、insert:插入 multi:多种,多数
顺序容器类的迭代器的用法
1 | QList<QString> list; |
关联容器类的迭代器用法
1 | QMap<int,int> map; |
1 | QMultiMap<int,int> map; //同一个键值,就会有链表 |
下面的代码是错误的
1 | for(i = map.values(2).begin();i!=map.values(2).end();i++)//可能这个begin遇不到end |
map.values(2).begin()与map.values(2).end() 拿到的数值可能不一样(发生了复制行为),也可能一样,不一样就产生错误了 std::addressof(*)解引用
注意:
对于STL类型的迭代器,隐式共享还涉及另外一个问题,既当有一个迭代器在操作一个容器变量时,不要去复制这个容器变量(会有不安全状态)
foreach关键字
1 | QLinkedList<QString> list; |
结果: a b
“A”:2
“A”:1
“B”:2