数组、链表、哈希……Qt中丰富的容器类
来源:互联网 发布:磁力软件下载 编辑:程序博客网 时间:2024/05/16 09:19
转载自:http://www.cnblogs.com/davesla/archive/2011/01/30/1948107.html
在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函数或者<<操作符来在数组最后端添加元素而不用担心溢出问题。
比如:
#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
比如:
#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中丰富的容器类
- 数组、链表、哈希……Qt中丰富的容器类
- 数组、链表、哈希……Qt中丰富的容器类
- 数组、链表、哈希……Qt中丰富的容器类
- 数组、链表、哈希……Qt中丰富的容器类
- 数组、链表、哈希……Qt中丰富的容器类
- Qt中丰富的容器类---数组QVector、链表QLinkedList、映射表QMap、哈希表QHash
- Qt之丰富的容器类---数组QVector、链表QLinkedList、映射表QMap、哈希表QHash
- 详解 Qt 中各种丰富容器类
- Qt组装丰富的积木
- Qt-组装丰富的积木
- qt的容器类
- QT学习6:组装丰富的积木!
- Qt的容器类之容器,迭代器
- 4. Qt的容器类
- Qt中提供的容器总结
- (面试)语言相关(不断丰富中……)
- (面试)网络相关(不断丰富中…)
- [iOS] xcode和svn中处理静态库的问题
- Ubuntu下设置adb环境变量
- 不同VLAN之间相互通信的两种方式(单臂路由、三层交换)
- 之后的传说
- Android AudioManager控制系统声音的流程
- 数组、链表、哈希……Qt中丰富的容器类
- 文件关联
- JAVA SSH框架
- 心得13--jsp简单标签案例分析.doc
- 启用 SQL Server 2008 R2 Service Broker
- sql server中的触发器
- SQL--多的是,你不知道的事 感觉标题好玩就转了
- Intent打开系统设置界面(action列表)
- php+artDialog信息维护框架