QT(3)
QMap
在Qt框架中,QMap 是一个非常有用的类,用于存储键值对(key-value pairs)。
它是一个有序的关联容器,键(keys)是唯一的,并且按照键的升序排列。
QMap 提供了高效的插入、查找和删除操作。
#include "mainwindow.h"
#include <QApplication>
#include <iostream>
using namespace std;
# if 1
// QMap
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// QMap
QMap<QString, int> map;
//添加元素
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
qDebug()<<map;//QMap(("one", 1)("three", 3)("two", 2))
map.remove("two");
qDebug()<<map;//QMap(("one", 1)("three", 3))
// map.clear();
// qDebug()<<map;//QMap()
//迭代器遍历
QMapIterator<QString, int> i(map);
while (i.hasNext()) {
i.next();
qDebug()<<i.key()<<" "<<i.value();
}
//最简单的遍历方式
for (auto key : map.keys()) {
qDebug()<<key<<" "<<map.value(key);
}
qDebug()<<"================";
//查找元素
qDebug()<<map.value("one");
qDebug()<<map.key(1);
//查找是否包含
qDebug()<<map.contains("one");
qDebug()<<map.contains("four");
qDebug()<<"================";
//输出所有key
QList<QString> keys = map.keys();
qDebug()<<keys;
//输出所有value
QList<int> values = map.values();
qDebug()<<values;
qDebug()<<"================";
//一个key对应多个value
//QMultiMap
QMultiMap<QString, QString> multiMap;
multiMap.insert("one","1");
multiMap.insert("one","2");
multiMap.insert("one","3");
multiMap.insert("two","4");
multiMap.insert("two","5");
multiMap.insert("two","6");
qDebug()<<multiMap;
//QMultiMap遍历
QMultiMapIterator<QString, QString> it(multiMap);
while (it.hasNext()) {
it.next();
qDebug()<<it.key()<<" "<<it.value();
}
MainWindow w;
w.show();
return a.exec();
}
# endif
输出:
QMap(("one", 1)("three", 3)("two", 2))
QMap(("one", 1)("three", 3))
"one" 1
"three" 3
"one" 1
"three" 3
================
1
"one"
true
false
================
QList("one", "three")
QList(1, 3)
================
QMultiMap(("one", "3")("one", "2")("one", "1")("two", "6")("two", "5")("two", "4"))
"one" "3"
"one" "2"
"one" "1"
"two" "6"
"two" "5"
"two" "4"
Qhash
//todo QHash
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
QHash<QString, int> hash;
hash.insert("one", 1);
hash.insert("two", 2);
hash["three"]=3;
hash["four"]=4;
qDebug()<<hash;
//遍历
for(auto key:hash.keys()){
qDebug()<<key<<" "<<hash[key];
}
QHashIterator<QString, int> i(hash);
while(i.hasNext()){
i.next();
qDebug()<<i.key()<<"--->"<<i.value();
}
//删除
hash.remove("two");
qDebug()<<hash;
//检查是否为空
qDebug()<<hash.isEmpty();
//获取大小
qDebug()<<hash.size();
return a.exec();
}
输出:
QHash(("four", 4)("two", 2)("three", 3)("one", 1))
"four" 4
"two" 2
"three" 3
"one" 1
"four" ---> 4
"two" ---> 2
"three" ---> 3
"one" ---> 1
QHash(("four", 4)("three", 3)("one", 1))
false
3
Qmap 和 Qhash 的区别
QHash 和 QMap 都是 Qt 框架中用于存储键值对(key-value pairs)的类,但它们在实现和性能上有一些重要的区别:
顺序性:
QMap 是有序的关联容器,键(keys)按照升序排列。
QHash 是无序的关联容器,键(keys)没有特定的顺序。
查找速度:
QHash 提供了平均常数时间复杂度(O(1))的查找速度,这使得它在处理大量数据时比 QMap 更快。
QMap 的查找速度是对数时间复杂度(O(log n)),虽然也很高效,但在大数据集上可能不如 QHash 快。
内存使用:
QHash 通常比 QMap 使用更多的内存,因为它需要维护一个哈希表来实现快速的查找。
QMap 的内存使用相对较少,因为它使用的是平衡二叉树(通常是红黑树)。
迭代器稳定性:
QHash 在插入或删除元素时可能会使迭代器失效,尤其是在重新哈希(rehashing)时。
QMap 的迭代器在插入或删除元素时通常是稳定的,不会失效。
键的唯一性:
两者都要求键是唯一的,如果插入一个已经存在的键,新值会替换旧值。
API 接口:
QHash 和 QMap 提供了类似的 API 接口,因此在使用上可以比较方便地互相替换。
总结来说,如果你需要键值对按照键的顺序排列,或者对内存使用有严格要求,可以选择 QMap。
如果你需要快速的查找速度,尤其是处理大量数据时,可以选择 QHash。
QVector
QVector 是 Qt 框架中的一个动态数组类,类似于 C++ 标准库中的 std::vector。
它提供了高效的随机访问和动态调整大小的功能。
QVector 是一个模板类,可以存储任何类型的数据。
//todo QVector
int main(int argc, char *argv[]){
QApplication a(argc, argv);
MainWindow w;
w.show();
QVector<int> vec;
vec<<1<<2<<3<<4;
vec.append(5);
vec.append(6);
vec.append(7);
vec.append(8);
qDebug()<<vec;
//元素个数
qDebug()<<vec.count();
//遍历
for(int i=0;i<vec.count();i++){
qDebug()<<vec[i];
}
//删除元素
vec.remove(2);
for(int i=0;i<vec.count();i++){
qDebug()<<vec[i];
}
vec.remove(1,2);
for(int i=0;i<vec.count();i++){
qDebug()<<vec[i];
}
//判断容器是否为空
qDebug()<<vec.isEmpty();
//判断是否包含某个元素
qDebug()<<vec.contains(5);
//获取元素的索引
qDebug()<<vec.indexOf(5);
//获取元素的最后一个索引
qDebug()<<vec.lastIndexOf(5);
return a.exec();
}
QList
是 Qt 框架中的一个通用列表容器类,
用于存储任意类型的元素。
与 QVector 不同,QList 使用了分段数组的方式来存储其元素,
这使得它在内存管理和性能上有不同的特性。
#include <QList>
#include <QString>
#include <QDebug>
int main() {
// 创建一个 QList 对象
QList<QString> list;
// 添加元素
list.append("apple");
list.append("banana");
list.append("cherry");
// 访问元素
QString firstElement = list.at(0);
qDebug() << "First element:" << firstElement;
// 修改元素
list[1] = "blueberry";
// 遍历 QList
for (int i = 0; i < list.size(); ++i) {
qDebug() << "Element at index" << i << ":" << list.at(i);
}
// 遍历 QList 的另一种方式
for (const QString& element : list) {
qDebug() << "Element:" << element;
}
//迭代器遍历
QListIterator<QString> i(list);
while (i.hasNext()) {
i.next();
qDebug()<<i.value();
}
// 删除元素
list.removeAt(2);
// 检查是否为空
if (list.isEmpty()) {
qDebug() << "List is empty";
} else {
qDebug() << "List is not empty";
}
// 清空 QList
list.clear();
return 0;
}