Qt中提供的容器总结

来源:互联网 发布:led拼接控制器软件 编辑:程序博客网 时间:2024/04/28 06:52

        高中的时候就接触到数组,之后大学里C++的课程就讲到指针,链表,但是从来都没有深入到数据结构的高度来考虑问题。
        在qt中,定义了不下十余种容器类,这些容器类提供了方便的操作函数和安全的控制,用于代替C++中传统的数组,但是容器种类繁多,很难学习,如果不深入了解各种容器的特点,实际使用中将会难于选择。
        这些容器中主要的有5种——QLinkedList<T>,QVector<T>,QList<T>,QMap<K,T>,QHash<K,T>,其中前三种是连续容器,后两种是关联容器,连续容器用于连续地存贮一种类型,关联容器存储键值对。
        QLinkedList<T>本质是一个链表(linked list),物理空间上不要求连续,故插入操作是一个强项,而数据查询是弱项。
        QVector<T>本质是一个数组(array),占据连续的存储空间,故数据查询是其强项,而插入是其弱项。
        QList<T>是综合了前面两者优点的产物,本质上是一个数组列表(array-list),可以理解为在链表基础上进行了索引优化(QLinkedList<T>是基于迭代的,所以查询速度慢),物理存储也不是连续的。
        QMap<K,T>本质上是一个跳表(skip-list),跳表是按照键值有序排列存储数据的结构,所以在Qt里要求K必须提供了<操作符,便于比较键值大小,来决定存放顺序。
        QHash<K,T>本质上是一个哈希表(hash table),哈希表是按照键值通过一定函数直接生成存储地址的数据结构,而不像其他方式要通过键值的比较得到存储位置,这也就决定了哈希表的存储空间是分散的,但是访问速度却非常的快。自然地,哈希表的键值需要提供==操作符,并且需要提供对全局函数qHash()的支持。 
        下面表格列出了几种容器的时间复杂度:


        其中哦o(1)表示无论容器大小,操作时间不变,Amort. o(1)表示多次调用的情况下的整体时间复杂度为o(1)。
        了解了基本的容器类,就容易理解派生的容器类,QList<T>派生了QQueue<T>,用于队列,QVector<T>派生了QStack,用于栈,QMap<K,T>派生了QMultiMap<K,T>,QHash<K,T> 派生了QMultiHash<K,T>,用于一个键,对应多个值的情况。这些派生类和他们的基类拥有相同的数据结构,都很好理解。另外还有一个QSet<T>,和QHash<K,T>相类似,不过是以哈希表存储的隐藏了键值的容器类,内部也是由哈希表来控制存储。
        以上所述容器类中,QList<T>使用最为广泛,而且派生出了一些(4个)特定类型的数组,其中用的非常多的就是QStringList,严格说来,QStringList派生自QList<QString>,针对字符串又添加了一些接口函数。


        





原创粉丝点击