Qt 容器 遍历 用法 学习

it2023-02-06  80

Qt 容器 遍历 用法 学习

文章目录

Qt 容器 遍历 用法 学习容器类非关联容器类关联容器类QListQMap 遍历容器java风格的IteratorIterator 迭代器QListIteratorQMapIterator STL风格迭代器foreach关键字

本文主要是对容器 和迭代器的学习 废话很少 都是在点上 更多的是代码示列

若有不对的地方希望大家批评指正

程序中使用的类

#include <QCoreApplication> #include <QList> #include <QDebug> #include <QListIterator> #include <QMutableListIterator> #include <QMapIterator> #include <QMutableMapIterator>

容器类

非关联容器类

QListQLinkedList 链表QVector 占用连续内存QStack 后进先出(LIFO)QQueue 先进先出(FIFO)

关联容器类

存储键值对

QMapQMultiMap 一键多值QHashQMutiHashQSetQCache 对缓存存储中对象的高效散列查找QContiguousCache

QList

操作函数

insert() << 插入 replace() 替换 removeAt() 移除 move() 移动 swap() 交换 append() 添加到表尾 prepend() 添加到表头 removeFirst() 移除第一项 removeLast() 移除最后一项 takeAt() takeFirst() takeLast() 获取此项并删除 indexOf() 获取索引 contains() 匹配相同项 count() 某项出现的次数 at 比 [] 索引快 /* QList */ QList <QString> list; list<<"aa"<<"bb"<<"cc"; //插入项目 if(list[1]=="bb") list[1]="ab"; list.replace(2,"bc"); //"cc"替换为 "bc" qDebug()<<"the list is:"; for(int i=0;i<list.size();++i) //输出整个list { qDebug()<<list.at(i); } list.append("dd"); //添加到尾部 list.prepend("hh"); //添加到头部 QString str=list.takeAt(2); //获取第3项 并删除 qDebug()<<"at(2) item is :"<<str; qDebug()<<"the list is:"; for(int i = 0;i<list.size();++i) { qDebug()<<list.at(i); } list.insert(2,"mm"); //在位置2插入数据 "mm" list.swap(1,3); //交换项目1和项目3 list.append("mm"); qDebug()<<"the list is:"; for(int i=0;i<list.size();++i) { qDebug()<<list.at(i); } qDebug()<<"contains 'mm'?"<<list.contains("mm"); //list中是否包含"mm" qDebug()<<"the 'mm' count:"<<list.count("mm"); //包含"mm"个数 //默认返回匹配到的第一个的位置 qDebug()<<"the first 'mm' index:"<<list.indexOf("mm"); //从之指定位置(3)开始查找 qDebug()<<"the second 'mm' index:"<<list.indexOf("mm",3);
QMap

操作函数

insert() 插入 value() 获取值 不存在是默认返回0 可以设定返回的值 [] 获取一个值 不存在时 插入 contains() 匹配是否有相同 remove() 移除一个键 take() 获取该键值并移除该键 clear() 清空 insertMulti() 插入一键多值 /*QMap */ QMap<QString,int>map; //插入 map["one"] = 1; map["three"] = 3; map.insert("seven",7); qDebug()<<map; //获取键的值 qDebug()<<"valuel:"<<map["six"]; //使用"[]" 没有键值时 会自动插入 qDebug()<<"contains 'six' ?"<<map.contains("six"); qDebug()<<map; //使用value()函数获取键值 不存在时不会自动插入 qDebug()<<map.value("five"); qDebug()<<"contains 'five' ?"<<map.contains("five"); //当键不存在时 value()默认返回0,可以设定该值 如设为9 qDebug()<<"nine:"<<map.value("nine",9); //map默认键对应一个值 可以重新设置 以前的会被覆盖 map.insert("ten",10); map.insert("ten",100); qDebug()<<"ten:"<<map.value("ten"); //使用insertMuti()函数实现一键多值 用values()来获取值的列表 map.insertMulti("two",2); map.insertMulti("two",20); //这样可以打印出源数据 qDebug()<<"two:"<<map.values("two"); //打印出每一项 QList <int>values =map.values("two"); for(int i=0;i<values.size();++i) { qDebug()<<values.at(i); } //使用QMultiMap 实现一键多值 QMultiMap <QString,int>map1,map2,map3; map1.insert("values",1); map1.insert("values",2); map2.insert("values",3); //可以进行相加操作 map3=map1+map2; qDebug()<<map3.values(); //打印map3中的每一项 QList <int> myvalues = map3.values("values"); for(int i=0; i<myvalues.size();++i) { qDebug()<<myvalues.at(i); }

容器可以嵌套使用 QMap<QString, QList<int> > "> >"之间必须有一个空格 否则编译器会将其当作“>>”

值的类型可以是任何可赋值的数据类型(有一个默认的构造函数,一个复制构造函数,一个赋值操作运算符)像基本的类型(int,double) 、指针型、Qt的数据类型(QString QDate等) 但不包括 QObject 及其子类(QWidget、QDialog、QTimer等),但可以存储这些类的指针 QList<QWidget*>

遍历容器

java风格的Iterator

Iterator 迭代器

QListIterator
java风格的迭代器的指向不是项目 而是项目之间 /*iterators 迭代器*/ //java风格iterators QList QList<QString>list; list<<"A"<<"B"<<"C"<<"D"; QListIterator<QString> i(list); //创建list的只读iterator list作为参数 qDebug()<<"the forward is:"; //正向遍历 (迭代器必须指向容器的最前面) while (i.hasNext()) { qDebug()<<i.next(); } // i.toBack(); qDebug()<<"the backwardis:"; //反向遍历 (迭代器必须指向容器的最后面) while (i.hasPrevious()) { qDebug()<<i.previous(); } QMutableListIterator<QString>j(list); j.toBack(); //返回列表尾 while (j.hasPrevious()) { QString str = j.previous(); if(str=="B") j.remove(); } j.insert("Q"); //在list最前面插入"Q" j.toBack(); if(j.hasPrevious())j.previous() = "N"; //直接赋值 j.previous(); j.setValue("M"); //使用setValue对上一次跳过的项赋值 j.toFront(); qDebug()<<"the forward is:"; while (j.hasNext()) { //正向遍历list qDebug()<<j.next(); }
QMapIterator
提供了跟QListIterator相同的函数 可以在返回项目的对象上使用 key() value() QMap<QString,QString>map; map.insert("Paris","France"); map.insert("Guatemala City","Guatemala"); map.insert("Mexico City","Mexico"); map.insert("Moscow","Russia"); QMapIterator<QString,QString>i(map); while (i.hasNext()) { i.next(); qDebug()<<i.key()<<":"<<i.value(); } if(i.findPrevious("Mexico"))qDebug()<<"find 'Mexico'"; //向前查找键的值 QMutableMapIterator <QString,QString> j(map); while(j.hasNext()) { if(j.next().key().endsWith("City")) //endWith() QString中的函数 { j.remove(); //删除有"City"结尾的键的项 } } while (j.hasPrevious()) { j.previous(); qDebug()<<j.key()<<":"<<j.value(); }

STL风格迭代器

其API模仿数组指针 通过“++”x向后移动 “*”指向迭代器返回的项 begin()指向第一个项目 end()指向最后一个项目的下一个虚项目 (end()标志着一个无效位置)"++"作为前缀时 会先修改迭代器后返回迭代器的一个引用 作为后缀时 修改前会进行复制 后返回这个复制 若不对返回值做处理的话 用前缀(++i)更快 //STL风格迭代器 /*QList*/ QList<QString>list; list<<"A"<<"B"<<"C"<<"D"; QList<QString>::iterator i; //使用读写迭代器 qDebug()<<"the forward is :"; for(i = list.begin();i!=list.end();++i) { *i=(*i).toLower(); //QString 的toLower()函数转换为小写 qDebug()<<*i; } qDebug()<<"the backward is:"; while (i !=list.begin()) { --i; qDebug()<<*i; } QList<QString>::const_iterator j; //使用只读Iterator qDebug()<<"the forward is:"; for(j=list.constBegin();j!=list.constEnd();++j) { qDebug()<<*j; } //QMap QMap<QString,int>map; map.insert("one",1); map.insert("two",2); map.insert("three",3); QMap<QString,int>::const_iterator p; qDebug()<<"the forward is :"; for(p = map.constBegin();p!=map.constEnd();++p) { qDebug()<<p.key()<<":"<<p.value(); }

foreach关键字

//foreach关键字 QList<QString>list; list<<"A"<<"B"<<"C"; qDebug()<<"the forward is:"; foreach(QString str,list) //从list中获取每一项 { qDebug()<<str; } QMap<QString,int>map; map.insert("first",1); map.insert("second",2); map.insert("third",3); qDebug()<<endl<<"the map is:"; foreach(QString str,map.keys()) //从map中获取每一项 qDebug()<<str<<":"<<map.value(str); QMultiMap<QString,int>map2; map2.insert("first",1); map2.insert("first",2); map2.insert("first",3); map2.insert("second",2); qDebug()<<endl<<"the map2 is:"; QList<QString>keys = map2.uniqueKeys(); //返回所有键的list foreach(QString str,keys) //遍历所有键 { foreach(int i,map2.values(str)) //遍历键中的所有值 qDebug()<<str<<" : "<<i; } foreach循环也可以使用break continue
最新回复(0)