Qt容器类介绍
Qt提供了一些顺序容器:QList,QLinkedList,QVector,QStack和QQueue。因为这些容器中的数据都是一个接一个线性存储的,所以称为顺序容器。
对于大多数应用程序而言,使用最多而且最好的时QList,尽管它是一个数组列表,但是可以快速在其头部和尾部进行添加操作。
如果需要使用一个链表,那么可以使用QLinkedList;
如果希望数据可以占用连续的内存空间,那么可以使用Vector。
而QStack和QQueue分别提供了后进先出(LIFO)和先进先出(FIFO)语义。
Qt还提供了一些关联容器:QMap,QMultiMap,QHash,QMultiHash和QSet。因为这些容器存储
的是<键,值>对,比如QMap<Key,T>,所以称为关联容器。其中,Multi容器用来支持一个键多个值的情况。
顺序容器
Qt 的顺序容器类有 QList、QLinkedList、QVector、QStack 和 QQueue。
QList
QList是最常用的容器类,虽然它是以数组列表的形式实现的,但是在其前或后添加数据非常快,QList以下标索引的方式对数据项进行访问。
QList用于添加、插入、替换、移动、删除数据项的函数又;insert(),replace(),removeAt(),move(),swap(),append(),prepend(),removeFirst(),和removeLast()等。
QList提供下标索引方式访问数据项,如同数组一样,也提供at()函数,例如:
QList<QString>list;
list<<"one"<<"two"<<"three";
QString str1=list[1];
QSring str0=list.at(0);
QList的isEmpty()函数在数据项为空时返回true,size()函数返回数据项的个数。
QLinkedList
QLinkedList<T>是链式列表,数据项不是用连续的内存存储的,它基于迭代器访问数据项,并且插入和删除数据项的操作事件相同。
除了不提供基于下标索引的数据项访问外,QLinkedList的其他接口函数与QList基本相同。
QVector
QVector<T>提供动态数组的功能,以下标索引访问数据。
QVector的函数接口与QList几乎完全相同,QVector<T>的性能比QList<T>更高,因为QVector<P>的数据项是连续存储的。
QStack
QStack<T>是提供类似于堆栈的后入先进(LIFO)操作的容器类,push()和pop()是主要的接口函数,例如:
QStack<int>stack;
stack.push(10);
stack.push(20);
stack.push(30);
while(!stack.isEmpty())
cout<<stack.pop()<<endl;
关联容器类
Qt还提供关联容器类QMap,QMultiMap,QHash,QMultiHash和QSet。
QMultiMap 和 QMultiHash 支持一个键关联多个值,QHash 和 QMultiHash 类使用散列函数进行查找,查找速度更快。
QSet
QSet是基于散列表的几何模板类,它存储数据的顺序是不定的 ,查找值得速度非常快。QSet<T>内部就是用QHash实现的。
定义QMap<QString,int>类型变量和赋值的例子:
QMap<QString int>map;
map["one"]=1;
map["two"]=2;
map["three"]=3;
也可以使用insert()函数赋值,或remove()移除一个键值对,如:
map.insert("four",4);
map.remove("two");
要查找一个值,使用运算符“[]”或 value() 函数
int num1 = map["one"];
int num2 = map.value("two");
QMultiMap
QMultiMap 是 QMap 的子类,是用于处理多值映射的便利类。
多值映射就是一个键可以对应多个值。QMap 正常情况下不允许多值映射,除非使用 QMap::insertMulti() 添加键值对。
QMultiMap 是 QMap 的子类,所以 QMap 的大多数函数在 QMultiMap 都是可用的,但是有几个特殊的,QMultiMap::insert() 等效于 QMap::insertMulti() , QMultiMap::replace() 等效于 QMap::insert()。
QMultiMap<QString, int> map1, map2, map3;
map1.insert("plenty", 100);
mapl.insert("plenty", 2000);
map2.insert("plenty", 5000);
map3 = map1 + map2; // map3.size() == 3
QMultiMap 不提供“[]”操作符,使用 value() 函数访问最新插入的键的单个值。如果要获取一个键对应的所有值,使用 values() 函数,返回值是 QList<T> 类型。
QList<int> values = map.values("plenty");
for (int i = 0; i < values.size(); ++i)
cout << values.at(i) << endl;
QHash
QHash 是基于散列表来实现字典功能的模板类,QHash<Key,T> 存储的键值对具有非常快的查找速度。
QHash 与 QMap 的功能和用法相似,区别在于以下几点:
- QHash 比 QMap 的查找速度快;
- 在 QMap 上遍历时,数据项是按照键排序的,而 QHash 的数据项是任意顺序的;
- QMap 的键必须提供“<”运算符,QHash 的键必须提供“==”运算符和一个名称为 qHash() 的全局散列函数
QMultiHash
QMultiHash 是 QHash 的子类,是用于处理多值映射的便利类,其用法与 QMultiMap 类似。
上一篇: 快速掌握MySQL数据库中SELECT语句_MySQL
下一篇: CI框架源码翻阅-Utf8.php