`
izuoyan
  • 浏览: 9224214 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Qt学习之路(35): Qt容器类之顺序存储容器

阅读更多
版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/245988
本来计划先来说下model/view的,结果发现model/view涉及到一些关于容器的内容,于是就把容器部分提前了。
容器Containers,有时候也被称为集合collections,指的是能够在内存中存储其他特定类型的对象的对象,这种对象一般是通用 的模板类。C++提供了一套完整的解决方案,成为标准模板库Standard Template Library,也就是我们常说的STL。
Qt提供了它自己的一套容器类,这就是说,在Qt的应用程序中,我们可以使用标准C++的STL,也可以使用Qt的容器类。Qt容器类的好处在于,它提供了平台无关的行为,以及隐式数据共享 技 术。所谓平台无关,即Qt容器类不因编译器的不同而具有不同的实现;所谓“隐式数据共享”,也可以称作“写时复制copy on write”,这种技术允许在容器类中使用传值参数,而不会发生额外的性能损失。Qt容器类提供了类似Java的遍历器语法,同样也提供了类似STL的遍 历器语法,以方便用户选择自己习惯的编码方式。最后一点,在一些嵌入式平台,STL往往是不可用的,这时你就只能使用Qt提供的容器类,除非你想自己创 建。
今天我们要说的是“顺序储存容器”。所谓顺序存储,就是它存储数据的方式是一个接一个的,线性的。
第一个顺序存储容器是QVector<T>,即向量。QVector<T>是一个类似数组的容器,它将数据存储在连续 内存区域。同C++数组不同之处在于,QVector<T>知道它自己的长度,并且可以改变大小。对于获取随机位置的数据,或者是在末尾处添 加数据,QVector<T>的效率都是很高的,但是,在中间位置插入数据或者删除数据,它的效率并不是很高。在内存中 QVector<T>的存储类似下图(出自C++ GUI Programming with Qt4, 2nd Edition):
同STL的vector<T>类类似,QVector<T>也提供了[]的重载,我们可以使用[]赋值:
QVector<double > v(2);
v[0] = 1.1;
v[1] = 1.2;
如果实现不知道vector的长度,可以创建一个空参数的vector,然后使用append()函数添加数据:
QVector<double > v;
v.append(1.1);
v.append(1.2);
在QVector<T>类中,<<也被重载,因此,我们也可以直接使用<<操作符:
QVector<double > v;
v << 1.1 << 1.2;
注意,如果QVector<T>中的数据没有被显式地赋值,那么,数据项将使用加入类的默认构造函数进行初始化,如果是基本数据类型和指针,则初始化为0.
QLinekdList<T>是另外一种顺序存储容器。在数据结构中,这是一个链表,使用指针连接起所有数据。它的内存分布如下(出自C++ GUI Programming with Qt4, 2nd Edition):
正如数据结构中所描述的那样,QLinkedList<T>的优点是数据的插入和删除很快,但是随机位置值的访问会很慢。与 QVector<T>不同,QLinkedList<T>并没有提供重载的[]操作符,你只能使用append()函数,或 者<<操作符进行数据的添加,或者你也可以使用遍历器,这个我们将在后面内容中详细描述。
QList<T>是一个同时拥有QVector<T>和QLinkedList<T>的大多数有点的顺序 存储容器类。它像QVector<T>一样支持快速的随机访问,重载了[]操作符,提供了索引访问的方式;它像 QLinkedList<T>一样,支持快速的添加、删除操作。除非我们需要进行在很大的集合的中间位置的添加、删除操作,或者是需要所有元 素在内存中必须连续存储,否则我们应该一直使用Qlist<T>。
QList<T>有几个特殊的情况。一个是QStringList,这是 QList<QString>的子类,提供针对QString的很多特殊操作。QStack<T>和 QQueue<T>分别实现了数据结构中的堆栈和队列,前者具有push(), pop(), top()函数,后者具有enqueue(), dequeue(), head()函数。具体情况请查阅API文档。
另外需要指出的一点是,我们所说的模板类中的占位符T,可以使基本数据类型,比如int,double等,也 可以指针类型,可以是类类型。如果是类类型的话,必须提供默认构造函数,拷贝构造函数和赋值操作符。Qt的内置类中的 QByteArray,QDateTime,QRegExp,QString和QVariant是满足这些条件的。但是,QObject的子类并不符合这 些条件,因为它们通常缺少拷贝构造函数和赋值操作符。不过这并不是一个问题,因为我们可以存储QObject的指针,而不是直接存储值。T也可以是一个容 器,例如:
QList<QVector<int > > list;
注意,在最后两个>之间有一个空格,这是为了防止编译器把它解析成>>操作符。这个空格是必不可少的,切记切记!
下面我们来看一个类(出自C++ GUI Programming with Qt4, 2nd Edition):
class Movie
{
public :
Movie(const QString &title = "", int duration = 0);

void setTitle(const QString &title) { myTitle = title; }
QString title() const { return myTitle; }
void setDuration(int duration) { myDuration = duration; }
QString duration() const { return myDuration; }

private :
QString myTitle;
int myDuration;
};
我们能不能把这个类放进Qt容器类呢?答案是肯定的。下面我们来对照着前面所说的要求:第一,虽然这个类的构造函数有两个参数,但是这两个参数 都有默认值,因此,像Movie()这种写法是允许的,所以,它有默认构造函数;第二,这个类表面上看上去没有拷贝构造函数和赋值操作符,但是C++编译 器会为我们提供一个默认的实现,因此这个条件也是满足的。对于这个类而言,默认拷贝构造函数已经足够,无需我们自己定义。所以,我们可以放心的把这个类放 进Qt的容器类。

本文出自 “豆子空间 ” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/245988

分享到:
评论

相关推荐

    Qt学习之路2

    13. **容器和遍历器**: Qt容器类提供了存储和管理数据集的功能,包括QList、QMap等。文档会讲解这些容器的使用方法和遍历技术。 14. **数据共享**: Qt中的隐式数据共享机制允许在不进行实际数据复制的情况下,共享...

    c++容器类&QT;容器

    ### C++ 容器类与 Qt 容器详解 #### C++ 容器类概述 在C++标准库中,容器类(containers)是用于存储数据的重要组件之一,它们为程序设计提供了高度灵活且功能丰富的数据管理手段。根据数据的组织形式不同,C++中...

    QT学习之路

    14. "QT容器类之顺序存储容器、遍历器和隐式数据共享、关联存储容器" 则涵盖了Qt提供的数据结构,如QList、QMap等,它们用于存储和管理数据集合。 15. "MODEL-VIEW架构" 这是Qt中用于分离数据显示和数据管理的架构...

    其实这本PDF就是Qt学习之路第一版

    ### Qt学习之路知识点总结 #### 一、前言:Qt简介与选择 - **Qt**是一种跨平台的应用程序开发框架,广泛应用于桌面、移动设备及嵌入式系统的GUI应用程序开发。 - C++的GUI编程并非C++标准的一部分,因此开发者在...

    qt学习之路.pdf

    Qt容器类提供了丰富的数据结构支持,包括顺序存储容器、关联存储容器等。本节介绍了容器类的使用和遍历方法。 20. MODEL-VIEW架构 Qt中的MODEL-VIEW架构用于数据和视图的分离。本节讲述了如何利用这种架构创建灵活...

    Qt学习之路(1-60)

    Qt容器类提供了一套标准的C++模板容器类,用于存储数据。容器类包括顺序存储容器、关联存储容器等。学习者将学习如何在Qt中使用这些容器类,以及它们的遍历器和隐式数据共享机制。 ### Model-View架构 Model-View...

    Qt5学习资料

    - 隐式数据共享:讨论Qt容器类的数据共享机制。 #### 11. model/view架构 - 介绍model/view架构的工作原理和优势。 - 讲解如何使用该架构分离数据和视图,以及如何使用QAbstractItemModel和QAbstractItemView。 ...

    Qt容器类(QList,QMap)遍历器的使用

    通过实践和学习,你可以熟练掌握Qt容器类的使用,从而编写出更加高效和简洁的代码。 总之,Qt的QList和QMap容器类提供了强大的数据管理和遍历功能。理解并熟练运用这两种容器类的遍历器,不仅可以优化代码的执行...

    c++ qt 笔记 qt 笔记

    Qt 提供了丰富的容器类来帮助管理和操作数据。这些容器大致可以分为两大类:顺序容器和关联容器。 #### 顺序容器 - `QList`: 功能丰富,提供了下标访问。 - `QLinkedList`: 除了不提供下标访问外,其余功能与 `...

    QT个人学习笔记

    QT的信号与槽机制是其核心特性之一,它提供了一种安全、类型匹配的对象间通信方式,替代了传统的回调函数。在QT中,所有使用信号与槽的类必须包含`Q_OBJECT`宏,这样QT的元对象系统才能识别并处理这些信号和槽。 ...

    QT自学的学习资料完整讲义

    在学习的最后部分,讲义引导学习者了解如何进行国际化,以及Qt的容器类,如顺序存储容器、遍历器和隐式数据共享、关联存储容器等,帮助开发者构建和管理数据。MODEL-VIEW 架构是Qt的精髓之一,通过学习QListWidget、...

    QT一个月自学教程

    - **11.1 顺序容器**:这部分介绍了Qt中的顺序容器类,如QList、QVector等,这些容器类适用于存储有序的数据集。 - **11.2 关联容器**:这里讨论了Qt中的关联容器类,如QMap、QHash等,这些容器类适用于基于键值对...

    精通qt4编程(源代码)

    \13.1 Qt容器类 326 \13.1.1 QList、QLinkedList和QVector 327 \13.1.2 QMap、QHash 332 \13.2 QString 334 \13.2.1 隐式共享 335 \13.2.2 内存分配策略 336 \13.2.3 操作字符串 336 \13.2.4 查询字符串数据 337 \...

    QT学习资料

    容器类章节介绍了QT中的各种容器类,这些容器类用于管理数据集合,比如顺序存储容器(如QList)、关联存储容器(如QMap)等。 Model-View架构是QT中用于数据和视图分离的设计模式,它支持对数据的复杂展示和编辑...

Global site tag (gtag.js) - Google Analytics