前言:
之前面试被问过一个问题,关于数据结构的:
问题:“你知道的数据结构有哪些?它们在实际程序中有哪些应用?”
答案: 数据结构分为线性结构和非线性结构,按照存储方式线性结构又分为顺序结构和链式结构,程序中常见的线性结构包括:数组、队列、链表、栈等。程序中常见的非线性结构包括二维数组、多维数组、树、图等。
容器的分类:
顺序容器:
QList、 QLinkedList、QVector、QStack和QQueue。因为这些容器中的数据都是一个接一个线性存储的,所以成为顺序容器。
- QList: 是目前最常用的容器类。它存储了给定类型的值的一个列表,这些值可以通过索引访问。在QList的内部是通过使用数组实现的,以确保进行快速的基于索引访问。它的一些方法:QList::append()--在列表的尾部添加项目;QList::prepend()--在列表的头部添加项目;QList::insert()--在列表的中间插入项目。常用的QStringList就继承自QList<QString>。
- QLinkedList: 它和QList基本相同,区别在于:QLinkedList使用迭代器访问项目,而QList一般使用整数索引访问项目;在向一个很大的列表中间插入项目时,QLinckedList比QList拥有更好的性能。(注意: 当迭代器指向QLinckedList的一个项目后,只要这个项目还存在,那么迭代器就依然有效;而当迭代器指向QList中的一个项目后,如果QList进行了插入或者删除操作,这个迭代器就无效了。)
- QVector: 占用连续的内存控件存储给定类型的值的一个数组。在vector的前面或者中间插入项目是非常缓慢的,因为这样可能导致大量的项目在内存中移动一个位置。
- QStack: 它是QVector的一个便捷子类,提供了后进先出语义。添加了push()、pop()、和top() 等函数。
- QQueue: 它是QList的一个便捷子类,提供了先进先出语义。添加了enqueue()、dequeue() 和head() 等函数。
关联容器:
QMap、QMultiMap、QHash、QMultiHash和QSet。因为这些容器存储的是<键、值>对,比如QMap<Key, T>,所以被称为关联容器。
- QMap: 它提供了一个字典(关联数组),将Key类型的键值映射到值上。一般一个键关联单一的一个值。QMap使用键顺序来存储它的数据(自动根据键的顺序进行排序);如果不关心存储顺序,还可以使用QHash来代替它,因为QHash速度更快。
- QMultiMap: 它是QMap的一个便捷类,提供了实现多值映射的接口函数,例如一个键可以关联多个值。
- QHash: 它与QMap拥有基本相同的接口,但是它的查找速度更快。QHash的数据是以任意的顺序存储的。
- QMultiHash: 它是QHash的一个便捷类,提供了实现多值散列的接口函数。
- QSet: 它提供了一个可以快速查询单值的数学集。