目录
容器类
顺序容器类
QLlist
QList<T>是最常用的容器类,是以数组列表(array-list)的形式实现的,QList<T>可以以下标索引的方式对数据项进行访问,常用函数:
函数 | 作用 |
insert(value) | 指定位置插入 |
replace(value) | 替换 |
removeAt(value) | 删除指定对象 |
move() | 移动 |
swap() | 交换 |
append(value) | 在末尾添加 |
prepend(value) | 从头部插入 |
removeFirst() | 移除第一个对象 |
removeLast() | 移除最后一个对象 |
isEmpty() | 是否为空,为空则为true |
size() | 返回数据项的个数 |
at(i) | 获取第i个值 |
例如:
QList<QString> list;
list<<"one"<<"two"<<"three";
QString str1=list[1]; //"two"
QString str0=list.at(0); //"one"
QLinkedList
QLinkedList<T>是一个链式列表,基于迭代器访问数据项,并且插入和删除数据项的操作时间相同,不提供基于下标索引的数据项访问,其余函数和QList<T>基本相同。
QVector
QVector<T>是一个提供动态数组的功能,可以以下标索引访问数据,函数接口与QList<T>基本相同,性能比QList更高,因为QVector<T>的数据项是连续存储的。
QStack
QStack<T>是提供类似于堆栈的后入先出(LIFO)操作的容器类,常用函数:
函数 | 作用 |
push(value) | 推入数据 |
pop() | 弹出最上方的数据 |
QQueue
QQueue<T>是提供类似于队列的先入先出(FIFO)操作的容器类,常用函数:
函数 | 作用 |
enqueue(value) | 入队列 |
dequeue() | 出队列w |
关联容器类
QSet
QSet<T>是基于散列表的集合模板类,存储数据的顺序是不定的,查找值的速度很快,内部是由QHash实现的,常用函数:
函数 | 作用 |
contains(value) | 查找一个值是否包含于这个集合,查找成功为true |
QMap
QMap<key,T>提供一个字典(关联数组)的容器类,一个键映射到一个值,并且也可用下标索引查询和对数据赋值。QMap存储数据是按照键的顺序存储的,即当你插入完数据后QMap会自动按键排序,如果不在乎存储顺序,则QHash会更快。常用函数:
函数 | 作用 |
insert(key,value) | 插入一对键值 |
remove(key) | 移除一个键值对 |
values(key,[value]) | 查找一个值,找到了就返回这个值,没找到,可以设置一个value,来返回这个value |
insertMulti() | 一般QMap不允许多值映射,但是使用这个函数可以添加键值对 |
keys() | 获取所有值,返回类型是QList<key>类型,注意,QMap没有key()函数 |
例如:
//对map进行赋值,赋值是按顺序存储的
QMap<QString,int>map;
map["one"]=1;
map["two"]=2;
map["three"]=3;
QMultiMap
QMultiMap<key,T>是QMap<key,T>的子类,用于处理多值映射的便利类,就是一个键可以对应多个值,QMultiMap不提供“[]”操作符,常用函数:
函数 | 作用 |
insert(key,value) | 插入键值对 |
replace(key,value) | 替换, 如果已经有一个项目有了键值,那么这个项目的值会被替换成value。 如果有多个带有key key的项目,最近插入的项目的值将被替换为value。 |
value(key) | 访问最新插入的键的单个值 |
values(key) | 获取键的所有值,返回值是QList<T>类型 |
QHash
QHash<key,T>是基于散列表来实现字典功能的模板类,QHash<key,T>存储的键值对待具有非常快的查找速度。
QHash与QMap的功能和用法相似,区别如下:
- QHash比QMap的查找速度更快
- 在QMap上遍历时,数据项必须是按照键的排序的,而QHash的数据项是任意的
- QMap的键必须提供"<"运算符,QHash的键必须提供"=="运算符和一个名词为qHash()的全局散列函数
迭代器
Java类型迭代器
Java类型迭代器不是指向数据项,而是在数据项之间,如图:
常用函数:
例如:
顺序容器:
//JAVA类型迭代器
//只读
QListIterator<QString> i(s);
//for循环
for (; i.hasNext();)
{
qDebug() << i.next();
}
i.toFront();
//while
while (i.hasNext())
{
qDebug() << i.next();
}
//读写
QMutableListIterator<QString> o(s);
o.toFront();
for (; o.hasNext();)
{
o.next(); //这里的o.next要和setvalue交换位置,因为,JAVA迭代器是从前面开始的,就是先next跳过这一项并返回跳过的这一项的值,用以下面的操作
o.setValue("帅");
}
o.toFront();
while (o.hasNext())
{
qDebug() << o.next();
}
关联容器:
//JAVA迭代器
//只读
QMapIterator<int, QString> k(map);
for (; k.hasNext();)
{
k.next();
qDebug() << k.key() << k.value();
}
注意:
Java类型的迭代器是指向数据项之间的,每次使用next()函数时,迭代器是先跳到下一对数据项之间,再返回跳过的数据项的值,供于下面的操作的。如图:
STL类型迭代器
STL类型的迭代器是数组指针,并且是直接指向数据项的与Java的不同,所以“++”运算符可以使迭代器指向下一个数据项,“*”运算符可以返回数据项的内容。
注意:在定义只读迭代器和读写迭代器时,他们使用的是不同的关键字,此外还可以使用const_reverse_iterator和reverse_iterator定义相应的反向迭代器。
常用函数:
函数 | 作用 |
begin() | [用于读写迭代器]使迭代器指向容器的第一个数据项 |
end() | [用于读写迭代器]使迭代器指向一个虚拟的表示结尾的数据项 |
constBegin() | [用于只读迭代器]表示起始位置 |
constEnd() | [用于只读迭代器]表示结束位置 |
rbegin() | [用于反向读写/只读迭代器]表示起始位置 |
rend() | [用于反向读写/只读迭代器]表示结束位置 |
例如:
顺序容器:
//STL类型迭代器
//只读
QList<QString>::const_iterator m;
for (m = s.constBegin(); m != s.constEnd(); m++)
{
qDebug() << *m;
}
//读写
QList<QString>::iterator n;
for (n = s.begin(); n != s.end(); n++)
{
*n = "牛";
qDebug() << *n;
}
关联容器:
//STL迭代器
//只读
QMap<QString, int>::const_iterator cmp;
for (cmp = city_zone.constBegin(); cmp != city_zone.constEnd(); cmp++)
{
qDebug() << cmp.key() << cmp.value();
}
foreach关键字
foreach是<QtGolbal>头文件中定义的一个宏,作用是遍历容器中所有的项。使用foreach的语法是:
foreach(variable , container)
variable和container里的类型是一样的
例如:
对于顺序容器:
//foreach关键字
QList<QString> s;
//写法一
QString str;
foreach(str,s)
{
qDebug() << str;
}
//写法二
foreach(const string &str,s)
{
qDebug() << str;
}
对于关联容器:
//foreach关键字
QMap<QString,int> s;
//写法一
QString str;
foreach(str,s.keys())
{
qDebug() << str; //这里的str输出的是s中的每一个key值,而不是value值,要取value值
//得用s.value(str)函数
}
//写法二
foreach(const string &str,s.keys())
{
qDebug() << str;
}
注意:foreach是创建了容器的副本,所以不能修改原来容器变量的数据项,写法二里必须是常量定义的类型,const string &str