QT核心编程之集合类 (2)

移动开发
Qt有几个基于值和基于指针的集合类。基于指针的集合类使用指向条目的指针来工作,而基于值的集合类存储着它们条目的拷贝。基于值的集合类类似于STL容器类,能和STL算法和容器一起使用。

QT核心编程之集合类是本篇要介绍的内容。QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容。

一个集合类是装有多个条目的容器,每个条目是某种数据结构,集合类能执行对容器中的条目的插入、删除及查找等操作。

Qt有几个基于值和基于指针的集合类。基于指针的集合类使用指向条目的指针来工作,而基于值的集合类存储着它们条目的拷贝。基于值的集合类类似于STL容器类,能和STL算法和容器一起使用。

基于值的集合类说明如表4所示:

QT核心编程之集合类 

表4 基于值的集合类表

基于指针的集合类说明如表5所示:

QT核心编程之集合类

表5 基于指针的集合类表

QMemArray 是一个例外,它既不是基于指针也不是基于值,而是基于内存的结构。用于在有简单数据结构的数组中使用QMemArray效率***,QMemArray在拷贝和数组元素比较时使用位逻辑运算符操作。

这些类中有一些具有迭代器,迭代器是遍历集合类中的条目的类。在Qt模板库里,基于值的集合和算法集成在一起。下面讨论基于指针的容器。

1、基于指针的容器的结构

基于指针的容器有4个内部基类(QGCache, QGDict, QGList和QGVector)操作void类型指针。通过增加/删除条目指针,一个由这4个类组成的薄模板层实现了实际的集合。

允许Qt的模板类的策略使得在空间上很经济(实现这些模板类仅增加了对基类的内联调用),而且还不影响执行效率。

示例:QPtrList使用

下面的例子说明了如何存储Employee条目到一个链表,并将它们以相反的次序打印出来。

  1. #include <qptrlist.h> 
  2. #include <qstring.h> 
  3. #include <stdio.h> 
  4.  class Employee{public:    Employee( const char *name, int salary ) {  
  5.  n=names=salary;  
  6.  }  
  7.     const char *name()   const               {  
  8.  return n;   
  9. }   
  10.    int         salary() const    {   
  11. return s;  
  12.  }  
  13. private:    QString     n;  
  14.     int         s;  
  15. };  
  16.  int main(){  
  17.     QPtrList<Employee> list;        // 指向Employee的指针链表  
  18. list.setAutoDelete( TRUE );     //当链表条目被移动时,删除条目  
  19.      list.append( new Employee("Bill", 50000) ); //链表追加新的对象  
  20.     list.append( new Employee("Steve",80000) );  
  21.     list.append( new Employee("Ron",  60000) );  
  22.      QPtrListIterator<Employee> it(list); //遍历Employee链表  
  23.     for ( it.toLast(); it.current(); --it) ) { //从尾向头遍历  
  24.      Employee *emp = it.current();  
  25.         printf( "%s earns %d\n", emp->name(), emp->salary() );  
  26.     }  
  27.      return 0;  

程序运行结果如下:

  1. Ron earns 60000   
  2. Steve earns 80000   
  3. Bill earns 50000  

2、管理集合条目

所有基于指针的集合继承了QPtrCollection基类。这个类仅知道集合中的条目个数和删除策略。

当集合中的条目被移去时,缺省时它们不被删除。QPtrCollection::setAutoDelete()定义了删除策略。在上述QPtrList使用示例子,我们激活了自动删除功能来进行链表删除。

当插入一个条目到一个集合时,仅指针被拷贝,而不是拷贝条目本身。这称为浅拷贝。当插入一个条目时,拷贝所有条目的数组到集合中也是可能的,这称为深拷贝。

所有的集合类函数在插入条目时调用虚拟函数QPtrCollection::newItem()。如果你想进行深拷贝,你需要重载它。

当从一个链表中移去一个条目时,调用虚拟函数QPtrCollection::deleteItem()。如果自动删除功能被激活,在所有集合类中的缺省实现函数被调用来删除条目。

基于指针的集合类,如:QPtrList<type>,定义了指向对象的指针集合。我们在这里只讨论QPtrList类,其它的基于指针的集合类和所有集合类迭代器都有同样的使用方法。

模板实例化方法如下:

  1. QPtrList<Employee> list;  

在这个例子中,条目的类或类型是Employee,它必须在链表定义之前被定义。例如:

  1. class Employee {    ...};
  2. QPtrList<Employee> list; 

3、迭代器(Iterators)

QPtrListIterator能在链表被修改的同时非常安全的遍历链表。在同一个集合上,多个迭代器能独立地工作。

QPtrList有一个指向所有迭代器的内部链表,这些迭代器当前操作链表。当一个链表条目被移去时,链表更新所有的指向这个条目的迭代器。

QDict和QCache集合没有遍历函数。为了遍历集合,你必须使用QDictIterator或 QCacheIterator。

Qt预定义的集合类有字符串链表:QStrList, QStrIList (在qstrlist.h中)和 QStringList (在qstringlist.h中)。在绝大多数情况下你将选择QStringList,它是一个共享的QString Unicode字符串的值链表。QPtrStrList和 QPtrStrIList仅存储字符指针,而不是字符串本身。

基于指针的集合类和相关的迭代器类说明如表4。

QT核心编程之集合类  QT核心编程之集合类

表4 基于指针的集合类和相关的迭代器类列表

小结:QT核心编程之集合类的内容介绍完了,希望本文对你有所帮助,如果需要更多内容进行参考,请看编辑推荐。

【编辑推荐】

QT核心编程之Qt模板库(1)

QT核心编程之Qt线程 (3)

QT核心编程之鼠标拖放 (4)

QT核心编程之键盘焦点 (5)

QT核心编程之会话管理 (6)

QT核心编程之调试技术 (7)

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-06-22 10:12:08

Qt 线程

2011-06-22 09:40:32

QT 模板库 模板

2011-06-22 10:27:32

QT 键盘 焦点

2011-06-22 10:39:56

QT 会话管理

2011-06-22 10:20:11

QT 鼠标 拖放

2011-06-22 10:45:21

QT 调试

2011-06-17 14:29:55

Qt

2011-06-16 11:28:48

Qt QApplicati

2012-10-29 13:25:54

JavaScriptJSjQuery

2022-11-01 09:56:52

Python集合工具类

2015-04-24 09:48:59

TCPsocketsocket编程

2011-06-14 15:45:02

Qt Object

2011-07-21 10:17:53

java

2017-02-07 18:34:16

Linux编程PING

2022-02-14 15:07:48

进程FileChanne线程

2011-07-04 10:33:22

QT

2011-06-24 15:30:22

QT 皮肤 QSS

2011-06-10 12:44:09

2011-06-13 16:51:19

Qt Socket

2011-06-22 16:08:40

Qt 多线程 事件循环
点赞
收藏

51CTO技术栈公众号