差不多相等于C# Directory
QHash 是 Qt 框架提供的一个模板类,它是一个基于哈希表的字典(键值对)容器。你可以把它理解成 C++ 标准库中的 std::unordered_map。
核心特性:
-
键值对存储:它存储的是成对的数据,一个作为键,一个作为值。通过“键”来快速查找、访问对应的“值”。
-
极快的查找速度:这是 QHash 最主要的特点。无论 QHash 里面有多少数据,其查找、插入和删除的平均时间复杂度都是 O(1)(常数时间)。这比 QMap 的 O(log n) 要快。
-
无序性:QHash 中的元素是不按任何特定顺序存储的(既不是按键排序,也不是按插入顺序)。当你遍历一个 QHash 时,元素的顺序是不确定的。
-
要求键类型可哈希:要作为 QHash 的键,该类型必须有一个全局的
qHash()函数,用于计算其哈希值。Qt 已经为常见类型(如int、QString、QByteArray等)提供了qHash()函数。
基本用法
// 排列顺序是【无序】
创建
//创建一个QHash,键是QString,值是intQHash<QString, int> hash;
//插入数据
//插入数据/*QHash<Key, T>::insert方法的返回值是一个指向新插入键值对或者已存在键的更新后键值对的迭代器(QHash<Key, T>::iterator)*/hash["apple"] = 10;hash.insert("banana", 20);auto it = hash.insert("orange", 15);//返回该元素的迭代器qDebug() << "Inserted - Key:" << it.key() << "Value:" << it.value(); // 输出:Inserted - Key:
// 通过键访问值
// 通过键访问值 qDebug() << "Apple count:" << hash["apple"];// 输出: Apple count: 10qDebug() << "banana count:" << hash.value("banana");// 输出: Banana count: 20//如果没有这个键值,则是0qDebug() << "banana count:" << hash.value("banana1");// 输出: Banana count: 0 {QHash<int,QString> QHansQString;QHansQString.insert(0, "12");qDebug() << "string:" << QHansQString.value(0);// 输出:12qDebug() << "string:" << QHansQString.value(1);// 输出:""QString str = QHansQString.value(1);// 输出:""}
// 检查是否包含某个键
// 检查是否包含某个键bool IsExist = hash.contains("orange");bool IsExist1 = hash.contains("orange1");
// 遍历 (顺序是不确定的!)
// 遍历 (顺序是不确定的!)QHash<QString, int>::const_iterator i;for ( i = hash.constBegin(); i !=hash.constEnd(); i++){qDebug() << i.key() << ":" << i.value();}//第一次输出/* "apple" : 10"orange" : 15"banana" : 20*/ /* 第二次输出"apple" : 10"banana" : 20"orange" : 15*/
//数量
//数量int QHashCount = hash.count();//结果是:3
//删除一个键值对
//删除一个键值对 // QHash<Key, T>::remove()方法的返回值是一个整数(int),表示实际从哈希表中删除的键值对的数量int returncode= hash.remove("apple");//键存在 1 成功删除了与该键关联的单个键值对。//键不存在 0 哈希表中未找到指定的键,没有进行任何删除操作。int returncode1 = hash.remove("apple1");
//清除所有
//清除所有 hash.clear();int QHashCount1 = hash.count();//结果是:0