欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt容器类介绍

程序员文章站 2022-06-17 07:58:42
...

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 的功能和用法相似,区别在于以下几点:

  1. QHash 比 QMap 的查找速度快;
  2. 在 QMap 上遍历时,数据项是按照键排序的,而 QHash 的数据项是任意顺序的;
  3. QMap 的键必须提供“<”运算符,QHash 的键必须提供“==”运算符和一个名称为 qHash() 的全局散列函数

QMultiHash

QMultiHash 是 QHash 的子类,是用于处理多值映射的便利类,其用法与 QMultiMap 类似。