Qt学习总结(C鱼)之QList和QMap容器类
QList
QList
创新互联2013年开创至今,先为禄劝等服务建站,禄劝等地企业,进行企业商务咨询服务。为禄劝企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
1.大多数情况下可以用QList。像prepend()、append()和insert()这种操作,通常QList比QVector快的多。这是因为QList是基于index标签存储它的元素项在内存中(虽然内存不连续,这点与STL的list 是一样的),比那种依赖iterator迭代的容器类更快捷,而且你的代码也更少。
2.当迭代器指向QList中的一个项目后,如果QList进行了插入或者删除操作,那么这个迭代器就无效了。
3.QStringList类就是继承于QList
容器类(注意QList 其实是一个类模板,里面装的是QString类型,然后又有一个QStringList类继承于它)。
QList
#include
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList list;//创建了一个QList容器,容器内部存储QString类型的数据,返回一个list对象,该对象有很多操作该容器的方法。
list<<"aa"<<"bb"<<"cc";//可以采用<<的符号将数据输入到容器内存储。
if(list[1]=="bb")
{
list[1]="ab";
}
list.replace(2,"bc");//list对象的replace方法将指定索引位置的元素值替换成指定的类型值,参数1是list索引位置,参数2是指定替换的类型值。
qDebug()<<"the list is:";
for(int i=0;i
QMap
QMap
1.它将Key类型的键值映射到T类型的值上,一般每个键关联一个值,特殊情况出现于调用insertMulti函数插入多值。
2.并且它是根据键顺序来存储它的顺序的。所以,QMap强调顺序,那么如果你存储的数据不关心存储顺序,可以考虑使用QHash来代替它。
QMap
#include
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QMap map;//创建了一个QMap容器,容器内存储的键是QString类型,值是int类型,一个键只对应一个值,并且存储是讲究键顺序的。
map["one"]=1;//当给一个容器内不存在的键赋值时,会自动将键和值添加进容器内
map["three"]=3;
map.insert("seven",7);//也可以使用insert来为容器添加键值对。
int value1=map["six"];//当采用键索引的方式访问键的值时,若容器内无该键,那么就会自动插入该新键,并且值默认设为0。
qDebug()<<"value1:"< values=map.values("two");
qDebug()<<"two:"< map1,map2,map3;
map1.insert("values",1);//插入values键,指定第一个值为1
map1.insert("values",2);//再次为values键插入第二个值为2
map1.insert("qwe",888);//后面插入操作以此类推
map1.insert("qwe",999);
map2.insert("values",3);
map2.insert("rty",444);
map3=map1+map2;//相当于把map1对象内存储的values和qwe键(不管键对应多值还是单值),还有map2对象存储的values和rty键相合并然后全部放入到map3容器中。
QList myValues=map3.values("values");//QMultiMap容器类对象也跟QMap一样拥有values函数来返回指定键的所有值的列表
qDebug()<<"the values are:";
for(int i=0;i
遍历容器(使用迭代器)
Qt容器类提供了两种风格的迭代器,分别是JAVA风格迭代器和STL风格迭代器。JAVA风格迭代器有两种数据类型,分别是只读迭代器和读/写迭代器。下面分别讲解QList和QMap两种容器类型的两种迭代器。
QList容器的两种迭代器
例如:
QList(容器类)->QListIterator(只读迭代器)->QMutableListIterator(读/写迭代器)
QListIterator(注意,JAVA风格迭代器一直指向项目之间,不是直接指向项目)常用API:
- toFront():将迭代器移动到List列表的最前面(第一个项目之前)。
- toBack():将迭代器移动到List列表的最后面(最后一个项目之后)。
- hasNext():检查该迭代器后面是否还有项目。
- next():迭代器向后移动,,返回它所跳过的项目。
- peekNext():迭代器不移动,返回它本来能跳过的项目。
- hasPrevious():检查迭代器前面是否还有项目。
- previous:迭代器向前移动,返回它所跳过的项目。
- peekPrevious():迭代器不移动,返回它本来能跳过的项目。
上面的API,QMutableListIterator迭代器也都有,但由于QListIterator是只读迭代器,所以没有提供插入和删除项目的函数,而QMutableListIterator容器提供了insert和setValue函数来插入、设置值,remove函数来删除项目。还有要注意的是QMutableListIterator容器虽然也有next和precious函数,但是与QListIterator迭代器有所不同,前者的这两个函数返回的是非const引用,说明可以作为左值进行赋值操作,而后者的两个函数返回的是const引用,说明不能用来赋值操作,只能用于读取,很符合这个只读迭代器的定义。下面给出QMutableListIterator迭代器三个操作项目的函数用法:
insert(value):在迭代器指向的位置插入一个项目。
setValue(value):这个函数是将指定项目的值设置成指定的值,所以必须有个前提就是前面执行过next或者previous函数,其实意思就是这个函数对上一次跳过的项目进行赋值。
remove():删除上一次跳过的项目。
案例代码如下:
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList list;//创建了一个QList容器对象
list<<"A"<<"B"<<"C"<<"D";
QListIterator i(list);//创建了一个指向QList的只读迭代器,用list对象作为参数
qDebug()<<"the forward is:";
while(i.hasNext())
qDebug()< j(list);//创建了一个读/写迭代器
j.toBack();
while(j.hasPrevious()){
QString str = j.previous();
if(str=="B") j.remove();
}
/*
要十分注意上面这个while循环,其实原本是ABCD列表(假如从左到右排列),然后删除B后,因为最后又多执行了一次循环内部代码,所以迭代器就指向A的左侧了。
*/
j.insert("Q");
j.toBack();
if(j.hasPrevious()) j.previous()="N";
j.previous();
j.setValue("M");
j.toFront();
qDebug()<<"the forward is:";
while(j.hasNext())
qDebug()<
QMap容器的两种迭代器
例如:
QMap(容器类)->QMapIterator(只读迭代器)->QMutableMapIterator(读/写迭代器)
与QListIterator迭代器类似,QMapIterator迭代器也提供了toFront()、toBack()、hasNext()、next()、peekNext()、hasPrevious()、previous()和peekPrevious()等函数。我们知道next()、peekNext()、previous()和peekPrevious()可以遍历容器的内容,但仔细想想,前面QList还好,只有一个值,容易理解直接遍历取值就行,但是QMap可是字典,含有键值对,那么该怎样遍历获取键和值呢?next()、peekNext()、previous()和peekPrevious()这四个函数不再返回引用,而是直接返回项目对象。可以在返回的这个项目对象上分别使用key()和value()函数来获取键和值,也可以使用QMapIterator对象的key()和value()函数获取键和值,下面会有案例说明两者获取方法的不同。
代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QMap map;
map.insert("Paris","France");
map.insert("Guatemala City","Guatemala");
map.insert("Mexico City","Mexio");
map.insert("Moscow","Russia");
QMapIterator i(map);//创建了一个只读迭代器指向QMap对象
while(i.hasNext()){
i.next();
/*
注意,调用next函数后返回的是一个项目对象,可以使用这个项目对象的key()和value()方法获取,
例如:i.next().key()。但是对于这里的需求是我们需要获取键和值,如果连续两次执行i.next().key()
和i.next().value()那么迭代器就移动两次了,很明显不符合我们的需求。其实当单独执行了这个函数,迭代器也向后移
动了一次,并且内部已经保存了跳过的
项目的键和值,它告诉我们可以通过i对象的key()和
value()函数获取。就好像下面那条语句一样。
*/
qDebug()< j(map);
while(j.hasNext()){
//下面的j.next.key()语句可以看出,就是我们上面介绍的那样,不过这里的应用场景是为了只单独获取键,然后匹配以City的项目后再删除。
if(j.next().key().endsWith("City"))
j.remove();
}
while(j.hasPrevious()){
j.previous();
qDebug()<
分享文章:Qt学习总结(C鱼)之QList和QMap容器类
网页URL:http://azwzsj.com/article/igdpgo.html