Qt提供了多个基于模板的容器类,例如QStringList可以用来操作QList<QString>列表。Qt还提供了一个宏foreach用于遍历容器内的所有数据项
Qt容器分为顺序容器和关联容器类
注意:Qt6的QVector是QList的别名!
顺序容器
QList
它用连续的存储空间存储一个列表的数据,可以通过序号访问列表的数据,但在列表的开始和中间插入数据会比较慢!因为需要移动大量的数据。
QList<T>
QList<float> listF = {1.2,2.2,5.5};QList<QString> listS;
通过流操作符"<<"或者append()向列表添加数据
QList<QString> listS;listS<<"sss"<<"aaa"<<"lll";listS.append("kkk");
QList<QString> listS;listS<<"sss"<<"aaa"<<"lll"<<"sss";listS.append("kkk");//在列表末端添加数据listS.prepend("FFF");//在列表始端添加数据listS.insert(0,"ddd");//在列表的第0个位置插入数据(这个位置是从0开始)listS.replace(0,"cccc");//替换列表的第0个位置的数据qDebug()<<listS.at(0);//返回某个索引对应的元素listS.clear();//清除列表的所有元素,元素个数变为0qDebug()<<listS.size();//输出元素个数qDebug()<<listS.count("sss");//统计某个元素出现的个数,不带参数时等价与size()listS.reserve(10);//给列表预先分配内存,但不改变列表长度qDebug()<<listS.size();//测试列表长度,此时还是0qDebug()<<listS.isEmpty();//是否为空listS<<"kkk"<<"fff"<<"ccc";listS.removeAt(0);//移除第0个数据listS<< "sun" << "cloud" << "sun" << "rain";listS.removeAll("sun");//移除所有的sunqDebug()<<listS.takeAt(0);//移除并返回数据// 使用 foreach 遍历列表foreach (QString i,listS) {qDebug() << i;}
QStack
QStack是QList的子类,QStack<T>提供了类似栈的后进先出的容器
QStack<QString> stack;//stack<<"lll"<<"aaa"<<"ccc";//不正确的添加,建议使用pop和pushstack.push("kkk");stack.push("fff");foreach(QString i,stack){qDebug()<<i;}stack.pop();foreach(QString i,stack){qDebug()<<i;}while (!stack.isEmpty()) {qDebug()<<stack.pop();}
QQueue
队列类,先进先出
QQueue<QString> que;que.enqueue("kkk");que.enqueue("fff");que.enqueue("ccc");while (!que.isEmpty()) {qDebug()<<que.dequeue();}
关联容器
QSet
基于哈希表的集合模板类,查找速度快
QSet<QString> set;set<<"www"<<"hhhh"<<"aaaa"<<"qqq";qDebug()<<set.contains("www");//集合是否包含该元素
QMap
QMap<Key,T>定义字典(关联数值),是按顺序存储的。如果不介意顺序可以使用QHash
QMap<QString,int> map;map["one"] = 888;map["kkk"] = 50;//查找某个值可以使用[]或value()qDebug()<<map["kkk"];qDebug()<<map.value("one");map.insert("sss",77);//插入map.remove("one");//移除//在映射表若没有找到指定值,会返回一个默认值或者自己指定qDebug()<<map.value("oqqqne");qDebug()<<map.value("oqqqne",-1);
QMultiMap
多值映射表,即一个键对应多个值,QMultiMap<Key,T>
QMultiMap<QString,int> map1,map2,map3;map1.insert("kkk",888);map1.insert("kkk",999);qDebug()<<map1.values("kkk");//+s返回多个值qDebug()<<map1.value("kkk");//返回最新插入的值map2.insert("kkk",777);map3 = map1 + map2;qDebug()<<map3.values("kkk");//values返回值是QList<T>类型QList<int> v = map3.values("kkk");for (int i = 0;i<v.size();i++) {qDebug()<<v.at(i);}