数组、链表、哈希……各种容器类,在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函数或者<<操作符来在数组最后端添加元素而不用担心溢出问题。
比如:
- view sourceprint?01 #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
比如:
- view sourceprint?01 #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
小结:文章分别从QVector(数组)、QLinkedList(链表)、QMap(映射表)、QHash(哈希表)一一介绍,那么到这里,Qt 中各种丰富容器类 的内容介绍完了,最后希望本文对你有所帮助。