• 7827阅读
  • 2回复

[转载]数组、链表、哈希……Qt中丰富的容器类 [复制链接]

上一主题 下一主题
离线escene
 

只看楼主 倒序阅读 楼主  发表于: 2011-05-20
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函数或者<<操作符来在数组最后端添加元素而不用担心溢出问题
  比如:
"[ code ]
01#include<QVector>

02...

03void someFunction()

04{

05    QVector<QString> strArray;

06    strArray.append("Hello");

07    strArray<<"World!";

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

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

10}

11...

[ /code ]"




·当我们想要在某一项前面插入元素时,我们可以使用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
比如:
"[ code ]
01#include<QMap>

02...

03void someFunction()

04{

05    QMap<QString,QString> map;

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

07    QMap<int,double> i2d;

08    i2d[5231]=32.4213;

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

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

11    while(i.hasNext())

12        doSomething(i.next());

13}

14...




[ /code ]"


如果我们想用[]操作符访问某一项,但那一项并不存在,那就会自动创建,如果不想创建空白项可以使用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
离线dbzhang800

只看该作者 1楼 发表于: 2011-05-20
竟然会不提QList  ^_^,这些东西,还是多看Manual吧:

Qt provides the following sequential containers: QList, QLinkedList, QVector, QStack, and QQueue. For most applications, QList is the best type to use.

Qt also provides these associative containers: QMap, QMultiMap, QHash, QMultiHash, and QSet.

...
离线myseemylife

只看该作者 2楼 发表于: 2011-05-20
回 1楼(dbzhang800) 的帖子
可能是lz觉得太过熟悉了吧·~~~
。。。其实提到了~~~带过咯
[ 此帖被myseemylife在2011-05-20 18:09重新编辑 ]
蠢笨的愚钝~
快速回复
限100 字节
 
上一个 下一个