详解 Qt 中各种丰富容器类

移动开发
Qt作为一款优秀的类型库,当然不会没考虑这些。Qt提供了大量的“容器类”,专门用于以某种方式存储大量内容,QString其实只是这大量的容器类的一种。

数组、链表、哈希……各种容器类,在C++里做大型程序时,少不了要与数组、链表等数据结构打交道。就是最简单的字符串也常常让头痛万分,Qt中有QString解决了字符串的头痛,那么其他数组等有没有更简单的解决方案呢?

Qt作为一款优秀的类型库,当然不会没考虑这些。Qt提供了大量的“容器类”,专门用于以某种方式存储大量内容,QString其实只是这大量的容器类的一种。

QVector(数组)、QLinkedList(链表)、QMap(映射表)、QHash(哈希表)

QVector,是Qt对所有数组的封装,比如我们想要一个int类型数组,我们原先会写int array[10],我们在Qt里可以写QVector<int> array(10)

赋值的时候,我们依然可以照旧array[5]=4;想获取某一项的值也还可以array[9],也就是说,原来的特性我们还可以用。

那么QVector有什么好处呢?

我们可以用count函数获知数组中有多少个元素,方便遍历

原先我们必须预定义好大小,而用QVector我们虽然最好也先定义好大小,但是预先不定义也可以。

我们可以使用append函数或者<<操作符来在数组最后端添加元素而不用担心溢出问题。

比如:

  1. view sourceprint?01 #include<QVector>    
  2.  ...    
  3.  void someFunction()    
  4.  {    
  5.      QVector<QString> strArray;    
  6.      strArray.append("Hello");    
  7.      strArray<<"World!";    
  8.      strArray<<"也可以一行"<<"加多个元素"<<"这里一次加了3个";    
  9.     //现在strArray总共有5个字符串元素,strArray.count()==5    
  10.  }    
  11.  ...  

当我们想要在某一项前面插入元素时,我们可以使用insert,比如strArray.insert(1,"我在Hello与World之间");

QLinkedList。链表是大部分人极为头痛的内容,各种节点、内存地址之类的搞得人不胜其乱。但是QLinkedList使用起来轻松愉快,声明一个链表与数组类似,可以这样QLinkedList<QVector<int>>,QVector<QLinkedList<QLinkedList<double>>>,只要别把自己搞乱……

数组在末端插入元素是高效的但是在中间插入却是较慢的,QList在任何地方插入都是等速的,但是访问某个元素时并不方便,所以我个人更推崇另一种“链表”类型QList,与其说他是链表,其实他是个指针数组,所有数组的用法QList也一样用,不过他的原理什么的就不用知道的那么多了,知道用法跟QVector差不多一样就行了。有时数组中的每一个元素较庞大的话,建议使用QList而不是QVector。

QMap是个有趣的东西,想在裸露的底层C++实现它颇为麻烦。数组建立的是从0开始的连续数字与数据的对应关系,而QMap的作用就是,让任意一种数据类型对应于另一种数据类型。声明时如此:QMap<索引类型,数据类型> 变量名。他的表现有点类似于PHP编程的array

比如:

  1. view sourceprint?01 #include<QMap>    
  2.  ...    
  3.  void someFunction()    
  4.  {    
  5.      QMap<QString,QString> map;    
  6.      map["Hello"]="World";    
  7.      QMap<int,double> i2d;    
  8.      i2d[5231]=32.4213;    
  9.      //遍历比较特殊,得这样:    
  10.      QMapIterator<QString,QString> i(map);    
  11.      while(i.hasNext())    
  12.         doSomething(i.next());    
  13.  }   

 如果我们想用[]操作符访问某一项,但那一项并不存在,那就会自动创建,如果不想创建空白项可以使用value函数,如i2d.value(123,-0.1);这里如果i2d[123]存在的话就返回那一项,否则返回默认值-0.1,这个默认值可以不写,那样Qt系统就会使用Qt默认的默认值……。可以用take函数(让人纠结的函数名)来删除某一项。

QHash哈希表,与QMap几乎一样,但是它更高效,不过使用QHash要求作为索引的类型可以用==比较并且有对应的函数qHash,Qt里面自带了一部分,比如QString、各类整数、指针、QByteArray、QChar等都可以直接作为QHash的索引。因为QHash更高效,所以建议尽量使用QHash。

QMap与QHash都是一对一或多对以的映射,可以使用QMultiMap与QMultiHash建立一对多的映射。比如

  1. QMultiMap <int,QString> map;  
  2. map[3]="Hello";  
  3. map.insert(3,"World"); 

调用map[3]时,就会得到一个QList<QString>类型的变量。

遍历时依然可用 QMapIterator

小结:文章分别从QVector(数组)、QLinkedList(链表)、QMap(映射表)、QHash(哈希表)一一介绍,那么到这里,Qt 中各种丰富容器类 的内容介绍完了,最后希望本文对你有所帮助。

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

2011-07-04 16:12:00

QT QWidget

2011-06-14 11:48:38

Webkit QT

2011-07-04 14:29:25

Qt Designer 容器

2011-06-24 09:13:30

QT SDL

2011-08-12 14:04:53

iPhone动画

2009-05-12 10:55:06

SQLFOR XML模式

2011-06-29 17:20:20

Qt 内存 QOBJECT

2011-06-28 15:18:45

Qt 单例模式

2011-06-24 09:22:54

QT .pro文件 qmake

2011-06-24 15:16:33

Qt 插件

2011-06-30 16:38:07

Qt QTableWidg

2011-06-16 11:28:48

Qt QApplicati

2011-06-30 10:22:48

QT Graphics View

2011-07-04 17:45:45

Qt Sqlite 数据库

2011-08-29 14:59:26

QtEvent事件

2011-09-01 15:51:53

Qt插件VS 2010

2011-08-30 14:25:06

QT数据库

2011-06-30 10:09:26

QT Graphics View

2011-06-30 10:36:07

QT Graphics View

2011-06-20 09:26:38

Linux qtopia QT
点赞
收藏

51CTO技术栈公众号