Qt 容器 遍历 用法 学习
文章目录
-
本文主要是对容器 和迭代器的学习 废话很少 都是在点上 更多的是代码示列
-
若有不对的地方希望大家批评指正
-
程序中使用的类
-
#include <QCoreApplication> #include <QList> #include <QDebug> #include <QListIterator> #include <QMutableListIterator> #include <QMapIterator> #include <QMutableMapIterator>
容器类
非关联容器类
- QList
- QLinkedList 链表
- QVector 占用连续内存
- QStack 后进先出(LIFO)
- QQueue 先进先出(FIFO)
关联容器类
存储键值对
- QMap
- QMultiMap 一键多值
- QHash
- QMutiHash
- QSet
- QCache 对缓存存储中对象的高效散列查找
- 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