【QT学习五】Qt 的容器类QList,QVector,QSet,QMap等

目录

一、概述

1.1、Qt容器类的优点

1.2、Qt容器类的缺点

1.3、Qt容器类与STL容器类的对比

二、各个容器的说明

2.1、QList

2.2、QVector

2.3、QLinkedList

2.4、QMap

2.5、QHash

2.6、QSet


一、概述

        Qt是一个流行的C++跨平台应用程序框架,提供了一组通用的基于模板的容器类来帮助开发人员在他们的应用程序中有效地组织和管理数据。

        这些容器类包括QList、QVector、QLinkedList、QSet、QMap、QHash等。

1.1、Qt容器类的优点

  • Qt容器类的API相对简单,并且易于使用。
  • Qt容器类提供了诸如foreach等方便的迭代器,使得代码更加易于阅读和理解。
  • Qt容器类在某些情况下比STL容器类更快,例如QVector比std::vector更快。

1.2、Qt容器类的缺点

  • Qt容器类的实现与STL容器类的实现不同,这意味着它们不能和STL容器类一起使用。这可能会导致代码的可移植性问题。
  • 由于Qt容器类是Qt框架的一部分,因此如果您不使用整个框架,则必须为使用Qt容器类而引入整个框架。

1.3、Qt容器类与STL容器类的对比

  • Qt容器类更加轻量、更安全、并且更容易使用。
  • Qt容器类提供了一些STL容器类没有的功能,例如QSet、QLinkedList、QMap、QHash等。
  • Qt的容器类在速度、内存消耗和内联代码等方面进行了优化,在某些情况下,Qt容器类比STL容器类更快,例如QVector比std::vector更快。
  • STL容器类是C++标准库的一部分,因此它们在所有支持C++的平台上都是可用的。另一方面,Qt容器类只能在支持Qt的平台上使用。

注意:存储在Qt容器中的数据必须是可赋值的数据类型,Qt的Object类以及其子类是不能够存储在容器中的,但可以存储其指针。

例如:

Qvector lstLabel;//编译无法通过

Qvector lstLabel;//编译通过

二、各个容器的说明

2.1、QList

        QList是一个动态数组,类似于std::list,它可以自动调整大小以适应其包含的项目。它可以存储任何类型的对象,并提供了许多实用的函数来方便地访问和操作列表中的元素。由于它是基于指针实现的,所以插入和删除元素的效率比QVector更高。与QVector不同,使用QList时需要使用迭代器来访问元素。例如:

QList list;

list.append(1);

list.append(2);

list.append(3);


QList::iterator it;

for(it = list.begin(); it != list.end(); it++)

{

    qDebug() << *it;

}
  • 优点:支持高效的随机访问,可以快速插入和删除元素,可以保持元素的顺序。
  • 缺点:在插入和删除元素时,可能需要重新分配内存,导致性能下降。与QVector不同,QList是一个双向链表,因此在访问元素时可能会出现较大的缓存开销。

        QList的子类有QByteQrrayList,QItemSelection,QQueue,和QStringList.

2.2、QVector

        QVector是一个高效的动态数组,类似于std::vector,它提供了与QList相似的函数,但在某些情况下性能更好。它还提供了许多其他函数来优化数组的访问和操作。它可以自动调整大小以适应数据的数量,并且支持快速的随机访问。使用QVector时,我们可以使用下标运算符“[]”来访问元素。例如:

QVector v;

v.append(1);

v.append(2);

v.append(3);



for(int i = 0; i < v.size(); i++)

{

    qDebug() << v[i];

}
  • 优点:支持高效的随机访问,可以快速插入和删除元素,可以保持元素的顺序。
  • 缺点:在插入和删除元素时,可能需要重新分配内存,导致性能下降。

        QVector的子类有QPolygon,QPolygonF,QStack,QVulkanInfoVector和QXmlStreamAttributes。

2.3、QLinkedList

        QLinkedList是一个双向链表,可用于存储和操作任何类型的对象。它提供了许多函数来方便地访问和操作列表中的元素,它可以在任意位置快速插入和删除元素。在插入和删除元素时比QList更快,但是访问元素的效率比QList和QVector更低。使用QLinkedList时,我们也需要使用迭代器来访问元素。例如:

QLinkedList linkedList;

linkedList.append(1);

linkedList.append(2);

linkedList.append(3);



QLinkedList::iterator it;

for(it = linkedList.begin(); it != linkedList.end(); it++)

{

    qDebug() << *it;

}
  • 优点:支持快速插入和删除元素,对于大型数据集,性能更好。
  • 缺点:不支持随机访问,访问元素的速度较慢。

        Note: This class is obsolete, please use std::list instead.

2.4、QMap

        QMap是一个关联数组,它将键映射到值。它可以存储任何类型的对象,并提供了许多函数来方便地访问和操作映射中的元素。类似于std::map。它可以将键映射到值,并支持快速的查找和插入操作。例如:

QMap map;

map.insert("apple", 1);

map.insert("banana", 2);

map.insert("cherry", 3);



QMap::iterator it;

for(it = map.begin(); it != map.end(); it++)

{

    qDebug() << it.key() << ":" << it.value();

}
  • 优点:支持高效的查找,插入和删除元素,可以根据键排序元素。
  • 缺点:不能保持元素的插入顺序,不支持随机访问。
  • QMap是一个以升序键顺序存储键值对的数据结构,QMap的键类型Key必须提供operator<()函数。

        QMap的子类有QMultiMap。

2.5、QHash

        QHash是一个高效的哈希表,它将键映射到值。它提供了与QMap相似的函数,但在某些情况下性能更好。例如:

QHash hash;


hash.insert("key 2", 2);

hash.insert("key 0", 0);

hash.insert("key 1", 1);


QHash::const_iterator iter;

for(iter=hash.constBegin(); iter!=hash.constEnd(); ++iter)

{

    qDebug() << iter.key() << ":" << iter.value();

}
  • 优点:支持高效的查找,插入和删除元素,性能比QMap更好。
  • 缺点:不能保持元素的顺序,不支持随机访问。
  • QHash中的键值对在内部无序排列,QHash的键类型Key必须提供operator==()函数和一个全局的qHash(Key)函数。

         QHash的子类有QMultiHash。

2.6、QSet

        QSet是一个集合,它存储不同的值,并提供了许多函数来方便地访问和操作集合中的元素。它可以存储一组唯一的值,并支持快速的查找和插入操作。例如:

QSet set;

set.insert(1);

set.insert(2);

set.insert(3);


QSet::iterator it;

for(it = set.begin(); it != set.end(); it++)

{

    qDebug() << *it;

}
  • 优点:支持高效的查找,插入和删除元素,可以保持元素的唯一性。
  • 缺点:不能保持元素的顺序,不支持随机访问。

这些是一些常用的Qt容器类,它们提供了广泛的功能和灵活性,可以帮助开发人员轻松地管理和操作他们的数据。

你可能感兴趣的:(QT学习,qt,学习,开发语言)