Qt中关联容器QMap,QMultiMap,QHash,QMultiHash的使用
作者:哥不想学算法
在Qt中,有几种关联容器可供选择:
QMap:QMap是一个关联容器,存储键-值对,并根据键自动进行排序。它提供了快速的查找和插入操作,适用于需要根据键进行排序和搜索的场景。
QMultiMap:QMultiMap是一个关联容器,类似于QMap,但允许有重复的键。它还保了插入元素的顺序,可通过迭代器进行遍历。
QHash:QHash是一个关联容器,根据键的哈希值进行快速查找和插入操作。它不会对键进行排序,适用于需要快速查找的场景。
QMultiHash:QMultiHash是一个关联容器,类似于QHash,但允许有重复的键。它还保留了插入元素的顺序,可以通过迭代器进行遍历。
这些关联容器在Qt中提供了灵活而强大的数据结构选项,根据具体的需求和使用场景,您可以选择适合的容器来存储和管理数据。需要注意的是,这些容器都是基于Qt的容器类提供的,并且为了方便使用,它们也提供了类似STL容器的接口和使用方式。
1.QMap:QMap 是一个有序的关联容器,它根据键的排序来存储键-值对。示例用法如下:
#include <QMap> #include <QDebug> int main() { QMap<int, QString> map; // 插入键值对 map.insert(1, "Apple"); map.insert(2, "Banana"); map.insert(3, "Orange"); // 通过键查找值 qDebug() << map.value(2); // 遍历所有键值对 for(auto it = map.begin(); it != map.end(); ++it) { qDebug() << "Key:" << it.key() << "Value:" << it.value(); } return 0; }
2.QHash:QHash 是一个无序的关联容器,通过哈希函数来查找键-值对。示例用法如下:
#include <QHash> #include <QDebug> int main() { QHash<QString, int> hash; // 插入键值对 hash.insert("Apple", 10); hash.insert("Banana", 20); hash.insert("Orange", 30); // 通过键查找值 qDebug() << hash.value("Banana"); // 遍历所有键值对 QHash<QString, int>::iterator it; for(it = hash.begin(); it != hash.end(); ++it) { qDebug() << "Key:" << it.key() << "Value:" << it.value(); } return 0; }
3.QMultiMap:QMultiMap 是一个允许有重复键的有序关联容器。示例用法如下:
#include <QMultiMap> #include <QString> #include <QDebug> int main() { QMultiMap<int, QString> multimap; // 插入键值对 multimap.insert(1, "apple"); multimap.insert(2, "banana"); multimap.insert(1, "orange"); multimap.insert(3, "grape"); // 使用迭代器遍历multimap qDebug() << "Multimap elements:"; for (auto it = multimap.begin(); it != multimap.end(); ++it) { qDebug() << it.key() << "->" << it.value(); } // 使用equal_range函数查找与键关联的元素范围 auto range = multimap.equal_range(1); qDebug() << "Elements with key 1:"; for (auto it = range.first; it != range.second; ++it) { qDebug() << it.key() << "->" << it.value(); } return 0; }
输出为:
Multimap elements: 1 -> "apple1 -> "orange" 2 -> "banana" 3 -> "grape" Elements with key 1: 1 -> "apple" 1 -> "orange"
在上述示例中,我们使用QMultiMap类创建了一个multimap对象,并通过insert函数插入了一些键值对。然后,我们使用迭代器循环遍历整个multimap,并使用equal_range函数查找与键关联的元素范围。
4.以下是一个使用QMultiHash的示例用法:
#include <QMultiHash> #include <QDebug> int main() { QMultiHash<int, QString> multiHash; // 向多重哈希表插入键-值对 multiHash.insert(1, "Apple"); multiHash.insert(2, "Banana"); multiHash.insert(1, "Orange"); multiHash.insert(3, "Grape"); // 遍历所有键值对 for(auto it = multiHash.begin(); it != multiHash.end(); ++it) { qDebug() << "Key:" << it.key() << "Value:" << it.value(); } // 查找特定键的值 int key = 1; QList<QString> values = multiHash.values(key); qDebug() << "Values for key" << key << ":" << values; return 0; }
在上述示例中,我们创建了一个QMultiHash对象,并使用insert函数向哈希表中插入了多个键-值对。注意,由于QMultiHash允许存在重复的键,因此可以插入多个具有相同键的值。然后,我们使用迭代器遍历了整个多重哈希表,并打印出每个键值对。
接着,我们演示了如何使用values函数来查找特定键的所有值,并将它们存储在一个QList中。
那么有一个问题,QMultiHash和QMultiMap到底有哪些区别?
QMultiHash
和QMultiMap
是Qt提供的两种关联容器,它们都允许键的重复,但在实现和使用上有一些区别:
数据结构:
QMultiHash
使用哈希表作为其底层数据结构,而QMultiMap
使用有序的红黑树。由于哈希表的特性,QMultiHash
在插入和查找操作上通常比QMultiMap
更快,因为它使用哈希函数进行数据存储和问。而QMultiMap
能够保持数据的有序性,适合需要保持插入顺序的场景。迭代器顺序:
QMultiHash
迭代器的顺序是不确定的,而QMultiMap
的迭代器是根据键的排序顺序进行遍历的,因为QMultiMap
使用红黑树实现了基于排序的容器。接口差异:尽管两者提供了类似的接口,包括插入、查找、删除等功能,但在一些特定操作上有所不同,比如
QMultiHash
的values
函数返回一个列表,但对于QMap
,您可以使用find
函数查找特定键的范围。
根据需求,您可以选择QMultiHash
或QMultiMap
来适应不同的场景。如果需要快速的插入和查找操作,并且键的顺序并不重要,QMultiHash
是更好的选择。而如果需要保持有序并且对键的顺序有要求,QMultiMap
更适合。
到此这篇关于Qt中关联容器QMap,QMultiMap,QHash,QMultiHash的使用的文章就介绍到这了,更多相关Qt QMap,QMultiMap,QHash,QMultiHash内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!