首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

数组、链表、哈希…Qt中丰富的容器类

2012-07-25 
数组、链表、哈希……Qt中丰富的容器类数组、链表、哈希……Qt中丰富的容器类?xml:namespace prefix o ns ur

数组、链表、哈希……Qt中丰富的容器类

数组、链表、哈希……Qt中丰富的容器类<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

在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

2

3

4

5

6

7

8

9

10

11

#include<QVector>

...

void someFunction()

{

????QVector<QString> strArray;

????strArray.append("Hello");

????strArray<<"World!";

????strArray<<"也可以一行"<<"加多个元素"<<"这里一次加了3个";

????//现在strArray总共有5个字符串元素,strArray.count()==5

}

...

·当我们想要在某一项前面插入元素时,我们可以使用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

2

3

4

5

6

7

8

9

10

11

12

13

14

#include<QMap>

...

void someFunction()

{

????QMap<QString,QString> map;

????map["Hello"]="World";

????QMap<int,double> i2d;

????i2d[5231]=32.4213;

????//遍历比较特殊,得这样:

????QMapIterator<QString,QString> i(map);

????while(i.hasNext())

????????doSomething(i.next());

}

...


?如果我们想用[]操作符访问某一项,但那一项并不存在,那就会自动创建,如果不想创建空白项可以使用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建立一对多的映射。

比如QMultiMap <int,QString> map;

map[3]="Hello";

map.insert(3,"World");

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

遍历时依然可用?QMapIterator

分类:?QT(IDE=QT Creator)

?

热点排行