目录
1>、顺序容器:QList,QLinkedList,QVector,QStack 和 QQueue
2>、关联容器:QMap,QMultiMap,QHash,QMultiHash 和 QSet
一、前言:
如果想看 STL容器 的优缺点,请查看如下文章:
《C++ STL容器 底层数据结构》 https://blog.csdn.net/LearnLHC/article/details/89552420?spm=1001.2014.3001.5502
《c++ map、multimap 的使用方法》 https://blog.csdn.net/LearnLHC/article/details/89536774?spm=1001.2014.3001.5502
《QTL 容器 与 STL(1)- 写时复制》https://blog.csdn.net/LearnLHC/article/details/91983462
二、QT 容器
2.1、简述
这些类都是 隐式共享 和 可重入 的
隐式共享:仅在被写入时才被拷贝;仅读数据时,多个变量共享一块空间
可重入:首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是可重入,可以允许有多个该函数的副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。反例:全局变量(如:static)
且针对几个方面做了优化:
一是速度,二是较低的内存占用,三是尽可能少的内联代码,减少生成程序的体积。
另外,在所有线程都以只读的方式访问容器时,这些类是线程安全的。
要遍历容器中的元素,你可以使用两种风格迭代器:
Java 风格迭代器和 STL 风格迭代器。
Java 风格迭代器有更好的易用性和更高级的函数,
而 STL 风格迭代器则在效率上会略有优势,并且可以用于 Qt 和 STL 提供的泛型算法中。
Qt 还提供了 foreach 关键字,可以方便地遍历容器。
2.2、容器分类
1>、顺序容器:QList,QLinkedList,QVector,QStack 和 QQueue
对于大多数的应用,QList 是最适用的。虽然其基于数组实现,但支持在头部和尾部快速插入。
如果确实需要一个基于链表的列表,你可以使用 QLinkedList。
如果要求元素以连续内存的形式保存,那么可以使用 QVector。
2>、关联容器:QMap,QMultiMap,QHash,QMultiHash 和 QSet
"Multi" 容器可以方便地支持键值一对多的情形。
“Hash” 容器提供了快速查找的能力,这是通过使用哈希函数代替对有序集合进行二分查找实现的。
2.3、QT 各容器简述
类 | 综述 |
---|---|
QList | 这是目前使用最普遍的容器类,其保存了一个元素类型为T 的列表,支持通过索引访问。QList 内部通过数组实现,以确保基于索引的访问足够快。元素可以通过 QList::append() 和 QList::prepend() 插入到首尾,也可以通过 QList::insert() 插入到列表中间,和其他容器类不同的是,QList 为生成尽可能少的代码做了高度优化。QStringList 继承于 QList<QString>。 |
QLinkedList) | 这个类和 QList 很像,不同的是这个类使用迭代器进行而不是整形索引对元素进行访问。和 QList 相比,其在中间插入大型列表时其性能更优,而且其具有更好的迭代器语义。(在 QLinkedList 中,指向一个元素的迭代器只要该元素存在,则会一直保持有效,而在 QList 的迭代器则可能会在任意的元素插入或删除后失效。) |
QVector | 这个类以数组的形式保存给定类型的元素,在内存中元素彼此相邻。在一个 vector 的头部或中部插入可能会相当慢,因为这可能会导致大量元素需要在内存中移动一个位置。 |
QVarLengthArray<T, Prealloc> | 这个类提供了一个底层的变长数组,在速度极其重要的情况下可以用来代替 QVector |
QStack | 这个类继承于 QVector,用于为”后进,先出”(LIFO )提供便捷的语义支持。其为 QVector 添加了以下方法:QVector::push(),pop() 和 top() |
QQueue | 这个类继承于 |