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();//清除列表的所有元素,元素个数变为0
qDebug()<<listS.size();//输出元素个数
qDebug()<<listS.count("sss");//统计某个元素出现的个数,不带参数时等价与size()
listS.reserve(10);//给列表预先分配内存,但不改变列表长度
qDebug()<<listS.size();//测试列表长度,此时还是0
qDebug()<<listS.isEmpty();//是否为空
listS<<"kkk"<<"fff"<<"ccc";
listS.removeAt(0);//移除第0个数据
listS<< "sun" << "cloud" << "sun" << "rain";
listS.removeAll("sun");//移除所有的sun
qDebug()<<listS.takeAt(0);//移除并返回数据
// 使用 foreach 遍历列表
foreach (QString i,listS) {
qDebug() << i;
}
QStack
QStack是QList的子类,QStack<T>提供了类似栈的后进先出的容器
QStack<QString> stack;
//stack<<"lll"<<"aaa"<<"ccc";//不正确的添加,建议使用pop和push
stack.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);
}