Qt中关联容器QMap,QMultiMap,QHash,QMultiHash的使用

 更新时间:2023年09月16日 16:51:13   作者:哥不想学算法  
本文主要介绍了Qt中关联容器QMap,QMultiMap,QHash,QMultiHash的使用,这些关联容器在Qt中提供了灵活而强大的数据结构选项,根据具体的需求和使用场景,您可以选择适合的容器来存储和管理数据,感兴趣的可以了解一下

在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到底有哪些区别?

QMultiHashQMultiMap是Qt提供的两种关联容器,它们都允许键的重复,但在实现和使用上有一些区别:

  • 数据结构:QMultiHash使用哈希表作为其底层数据结构,而QMultiMap使用有序的红黑树。由于哈希表的特性,QMultiHash在插入和查找操作上通常比QMultiMap更快,因为它使用哈希函数进行数据存储和问。而QMultiMap能够保持数据的有序性,适合需要保持插入顺序的场景。

  • 迭代器顺序:QMultiHash迭代器的顺序是不确定的,而QMultiMap的迭代器是根据键的排序顺序进行遍历的,因为QMultiMap使用红黑树实现了基于排序的容器。

  • 接口差异:尽管两者提供了类似的接口,包括插入、查找、删除等功能,但在一些特定操作上有所不同,比如QMultiHashvalues函数返回一个列表,但对于QMap,您可以使用find函数查找特定键的范围。

根据需求,您可以选择QMultiHashQMultiMap来适应不同的场景。如果需要快速的插入和查找操作,并且键的顺序并不重要,QMultiHash是更好的选择。而如果需要保持有序并且对键的顺序有要求,QMultiMap更适合。

到此这篇关于Qt中关联容器QMap,QMultiMap,QHash,QMultiHash的使用的文章就介绍到这了,更多相关Qt QMap,QMultiMap,QHash,QMultiHash内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ Boost Conversion超详细讲解

    C++ Boost Conversion超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C++多线程强制终止详细

    C++多线程强制终止详细

    这篇文章主要介绍了C++多线程强制终止, 实际上,没有任何语言或操作系统可以为你提供异步突然终止线程的便利,且不会警告你不要使用它们。但是下面我们再来简单看看相关内容吧
    2021-09-09
  • 详解C++如何实现在Word文档中创建列表

    详解C++如何实现在Word文档中创建列表

    这篇文章主要为大家详细介绍了介绍如何使用C++在Word文档中创建编号列表、项目符号列表和多级列表,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-05-05
  • 全局静态存储区、堆区和栈区深入剖析

    全局静态存储区、堆区和栈区深入剖析

    在C++中,内存可分为系统数据区,自由存储区,文本区,const数据区,全局静态区,堆区和栈区
    2012-11-11
  • C语言详细讲解注释符号的使用

    C语言详细讲解注释符号的使用

    C语言的注释符是以“/*”开头并以“*/”结尾的串。在“/*”和“*/”之间的即为注释。程序编译时,不对注释作任何处理。注释可出现在程序中的任何位置。注释用来向用户提示或解释程序的意义。在调试程序中对暂不使用的语句也可用注释符括起来,使翻译跳过不作处理
    2022-04-04
  • c语言生成随机uuid编码示例

    c语言生成随机uuid编码示例

    这篇文章主要介绍了c语言生成随机uuid编码示例,需要的朋友可以参考下
    2014-05-05
  • C语言实现模拟USB对8bit数据的NRZI编码输出

    C语言实现模拟USB对8bit数据的NRZI编码输出

    今天小编就为大家分享一篇关于C语言实现模拟USB对8bit数据的NRZI编码输出,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++中strcpy和memcpy的区别小结

    C++中strcpy和memcpy的区别小结

    C++中strcpy和memcpy是两个用于数据拷贝的函数,但它们的设计目标、行为逻辑和适用场景有显著差异,下面就来介绍一下两者的区别,感兴趣的可以了解一下
    2025-07-07
  • Qt QDir路径类及使用方法

    Qt QDir路径类及使用方法

    QDir是Qt中用于操作文件系统目录的类,提供了多种方法来管理和查询目录,如设置当前目录、列举文件和子目录、创建和删除目录等,它支持基于字符串路径的操作,并且可以使用过滤器和排序功能,通过示例代码,展示了如何使用QDir进行各种目录操作,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • Easyx实现扫雷游戏

    Easyx实现扫雷游戏

    这篇文章主要为大家详细介绍了Easyx实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论