QMap与QHash

 关联容器可以保存任意多个具有相同类型的项,且它们由一个键索引。Qt提供两个主要的关联容器类:QMap<K, T>QHash<K, T>

     QMap<K, T>是一个以升序键顺序存储键值对的数据结构。这种排列使它可以提供良好的查找插入性能及键序的迭代。在内部,QMap<K, T>是作为一个跳越列表(skip-list)来实现执行的。

     在映射中插入项的一种简单方式是调用insert():

QMap<QString, int> map;

map.insert("eins", 1);

map.insert("sieben", 7);

map.insert("dreiundzwanzig", 23);

另外,也可以像下面一样,给一个指定的键赋值:

map["eins"] = 1;

map["sieben"] = 7;

map["dreiundzwanzig"] = 23;

    []操作符即可以用于插入也可以用于检索。如果在非常量映射中使用[]为一个不存在的键检索值,则会用给定的键和空值创建一个新的项。为了避免意外的创建空值,可以使用value()函数代替[]操作符来获得项。

int val = map.value("dreiundzwanzig")

    如果键不存在,则利用值类型的默认构造函数,将返回一个默认值,同时不会创建新的项。对于基本类型和指针类型,将返回0值。我们可以指定另一默认值作为value()的第二个参数,例如:

int seconds = map.value("delay", 30);

这相当于:

int seconds = 30;

if (map.contains("delay");

    seconds = map.value("delay");

    QMap<K, T>的K和T数据类型可以是与int、double、指针类型、有默认构造函数的类、复制构造函数和赋值操作符相似的基本数据类型。此外,K类型必须提供operator<(),因为QMap<K, T>要使用这个操作符以提升键序顺序存储项。

    QMap<K, T>的K和T有一对方便的函数keys()和values(),它们在处理小数据集时显的特别有用。它们分别返回映射键的QList和映射值的QList。

映射通常都是单一值的:如果赋予一个现有的键一个新值,则原有的旧值将被该新值取代,以确保两个项不会共有同一个键。通过使用insertMulti()函数或者QMlltiMap<K, T>方便的子类,可以让多个键值对有相同的键。QMap<K, T>重载了value(const K &), 返回一个给定键多有值的QList列表。例如:

QMultiMap<int, QString> multiMap;

multiMap.insert(1, "one");

multiMap.insert(1, "eins");

multiMap.insert(1, "uno");

QList<QString> vals = multiMap.values(1);

    QHash<K, T>是一个在哈希表中存储键值对的数据结构。它的接口几乎与QMap<K, T>相同,但是与QMap<K, T>相比,它对K的模板类型有不同的要求,而且它提供了比QMap<K, T>更快的查找功能。

    除了对存储在容器类中的所有值类型的一般要求,QHash<K, T>中K的值类型还需要提供一个operator==(),并需要一个能够为键返回哈希值的全局qHash()函数的支持。Qt已经为qHash()函数提供了对整型、指针型、QChar、QString以及QByteArray。

    QHash<K, T>为它内部的哈希表自动分配最初的存储区域,并在有项被插入或者删除时重新划分所分配的存储区域的大小。也可以通过调用reserve()或者squeeze()来指定或者压缩希望存储到哈希表中的项的数目,以进行性能调整。通常的做法是利用我们预期的最大的项的数目来条用reserve(),然后插入数据,最后如果有多出的项,则调用squeeze()以使内存的使用减到最小。

    虽然哈希表通常都是单一值的,但是使用insertMulti()函数或者MultiHash<K, T>方便的子类,也可以将多个值赋给同一个键。

    除了QHash<K, T>之外,Qt还提供了一个用来高速缓存与键相关联的对象的QCache<K, T>类以及仅仅存储键的QSet<K>容器。在内部,它们都依赖于QHash<K, T>,且都像QHash<K, T>一样对K的类型有相同的要求。

    最简便的遍历存储在关联容器中多有键值对的方式是使用Java风格的迭代器。因为迭代器必须能同时访问键和值,针对关联容器的Java风格的迭代器与连续容器的在运作方式有些差异。只要区别在于next()和previous()函数返回一个代表键值对的对象,而不是一个简单的值。我们可以使用key()和value()分别从这个对象中获得键和值。例如:

QMap<QString, int> map;

...

int sum = 0;

QMapIterator<QString, int> i(map);

while (i.hasNext())

    sum += i.next().value();

    如果需要同时存取键和值,可以先忽略next()或previous()的返回值并使用迭代器的key()和value()函数,它们都是针对最后被跳过的项进行操作的:

QMapIterator<QString, int> i(map);

while(i.hasNext()){

    i.next();

    if (i.value() > largestValue){

        largestKey = i.key();

        largestValue = i.value();

    }

}   

 

===========================================================================================

原文链接:http://newfaction.net/2010/11/17/qt-qhash-and-qmap-difference.html

QMap提供了一个从类项为key的键到类项为T的直的映射,通常所存储的数据类型是一个键对应一个直,并且按照Key的次序存储数据,
这个类也支持一键多值的情况,用类QMultiMap

QHash具有和QMap几乎完全一样的APi,此类维护这一张哈希表,表的大小和数据项是自适应的,QHash是以任意的顺序住址他的数据,,当然了他也是可以支持一键多值的,QMultiHash

两种之间的区别是:
QHash查找速度上显著于QMap
QHash以任意的方式进行存储,而QMap则是以key顺序进行存储
Qhash 的键类型必须提供operator==()和一个全局的qHash(key)函数。而QMap的键类型key必须提供operator<()函数

他们同样也是有两种风格的迭代容器。用来进行遍历的。。
STL 风格的

QMap<key,T>  QMap<key,T>::const_iterator QMap<key,T>::iterator//同样中间那个也是只读的,最后那个是读写的。

下面以一个例子来进行说明:

#include <QDebug>

int main(int argc, char *argv[])
{
    QMap<QString, QString> map;
    map.insert("beijing""111");
    map.insert("shanghai""021");
    map.insert("tianjin""022");
    map.insert("chongqing""023");
    map.insert("jinan""0531");
    map.insert("wuhan""027");   

QMap<QString, QString>::const_iterator i;
    for( i=map.constBegin(); i!=map.constEnd(); ++i)
        qDebug() << i.key() <<"        " << i.value();   
       
    QMap<QString, QString>::iterator mi;
    mi = map.find("beijing");
    if(mi != map.end())
        mi.value() = "010";
    QMap<QString, QString>::const_iterator modi;
    qDebug() << "";
    for( modi=map.constBegin(); modi!=map.constEnd(); ++modi)
        qDebug() << modi.key() <<"        " << modi.value();   
    return 0;
}

 关联容器可以保存任意多个具有相同类型的项,且它们由一个键索引。Qt提供两个主要的关联容器类:QMap<K, T>QHash<K, T>

     QMap<K, T>是一个以升序键顺序存储键值对的数据结构。这种排列使它可以提供良好的查找插入性能及键序的迭代。在内部,QMap<K, T>是作为一个跳越列表(skip-list)来实现执行的。

     在映射中插入项的一种简单方式是调用insert():

QMap<QString, int> map;

map.insert("eins", 1);

map.insert("sieben", 7);

map.insert("dreiundzwanzig", 23);

另外,也可以像下面一样,给一个指定的键赋值:

map["eins"] = 1;

map["sieben"] = 7;

map["dreiundzwanzig"] = 23;

    []操作符即可以用于插入也可以用于检索。如果在非常量映射中使用[]为一个不存在的键检索值,则会用给定的键和空值创建一个新的项。为了避免意外的创建空值,可以使用value()函数代替[]操作符来获得项。

int val = map.value("dreiundzwanzig")

    如果键不存在,则利用值类型的默认构造函数,将返回一个默认值,同时不会创建新的项。对于基本类型和指针类型,将返回0值。我们可以指定另一默认值作为value()的第二个参数,例如:

int seconds = map.value("delay", 30);

这相当于:

int seconds = 30;

if (map.contains("delay");

    seconds = map.value("delay");

    QMap<K, T>的K和T数据类型可以是与int、double、指针类型、有默认构造函数的类、复制构造函数和赋值操作符相似的基本数据类型。此外,K类型必须提供operator<(),因为QMap<K, T>要使用这个操作符以提升键序顺序存储项。

    QMap<K, T>的K和T有一对方便的函数keys()和values(),它们在处理小数据集时显的特别有用。它们分别返回映射键的QList和映射值的QList。

映射通常都是单一值的:如果赋予一个现有的键一个新值,则原有的旧值将被该新值取代,以确保两个项不会共有同一个键。通过使用insertMulti()函数或者QMlltiMap<K, T>方便的子类,可以让多个键值对有相同的键。QMap<K, T>重载了value(const K &), 返回一个给定键多有值的QList列表。例如:

QMultiMap<int, QString> multiMap;

multiMap.insert(1, "one");

multiMap.insert(1, "eins");

multiMap.insert(1, "uno");

QList<QString> vals = multiMap.values(1);

    QHash<K, T>是一个在哈希表中存储键值对的数据结构。它的接口几乎与QMap<K, T>相同,但是与QMap<K, T>相比,它对K的模板类型有不同的要求,而且它提供了比QMap<K, T>更快的查找功能。

    除了对存储在容器类中的所有值类型的一般要求,QHash<K, T>中K的值类型还需要提供一个operator==(),并需要一个能够为键返回哈希值的全局qHash()函数的支持。Qt已经为qHash()函数提供了对整型、指针型、QChar、QString以及QByteArray。

    QHash<K, T>为它内部的哈希表自动分配最初的存储区域,并在有项被插入或者删除时重新划分所分配的存储区域的大小。也可以通过调用reserve()或者squeeze()来指定或者压缩希望存储到哈希表中的项的数目,以进行性能调整。通常的做法是利用我们预期的最大的项的数目来条用reserve(),然后插入数据,最后如果有多出的项,则调用squeeze()以使内存的使用减到最小。

    虽然哈希表通常都是单一值的,但是使用insertMulti()函数或者MultiHash<K, T>方便的子类,也可以将多个值赋给同一个键。

    除了QHash<K, T>之外,Qt还提供了一个用来高速缓存与键相关联的对象的QCache<K, T>类以及仅仅存储键的QSet<K>容器。在内部,它们都依赖于QHash<K, T>,且都像QHash<K, T>一样对K的类型有相同的要求。

    最简便的遍历存储在关联容器中多有键值对的方式是使用Java风格的迭代器。因为迭代器必须能同时访问键和值,针对关联容器的Java风格的迭代器与连续容器的在运作方式有些差异。只要区别在于next()和previous()函数返回一个代表键值对的对象,而不是一个简单的值。我们可以使用key()和value()分别从这个对象中获得键和值。例如:

QMap<QString, int> map;

...

int sum = 0;

QMapIterator<QString, int> i(map);

while (i.hasNext())

    sum += i.next().value();

    如果需要同时存取键和值,可以先忽略next()或previous()的返回值并使用迭代器的key()和value()函数,它们都是针对最后被跳过的项进行操作的:

QMapIterator<QString, int> i(map);

while(i.hasNext()){

    i.next();

    if (i.value() > largestValue){

        largestKey = i.key();

        largestValue = i.value();

    }

}   

 

===========================================================================================

原文链接:http://newfaction.net/2010/11/17/qt-qhash-and-qmap-difference.html

QMap提供了一个从类项为key的键到类项为T的直的映射,通常所存储的数据类型是一个键对应一个直,并且按照Key的次序存储数据,
这个类也支持一键多值的情况,用类QMultiMap

QHash具有和QMap几乎完全一样的APi,此类维护这一张哈希表,表的大小和数据项是自适应的,QHash是以任意的顺序住址他的数据,,当然了他也是可以支持一键多值的,QMultiHash

两种之间的区别是:
QHash查找速度上显著于QMap
QHash以任意的方式进行存储,而QMap则是以key顺序进行存储
Qhash 的键类型必须提供operator==()和一个全局的qHash(key)函数。而QMap的键类型key必须提供operator<()函数

他们同样也是有两种风格的迭代容器。用来进行遍历的。。
STL 风格的

QMap<key,T>  QMap<key,T>::const_iterator QMap<key,T>::iterator//同样中间那个也是只读的,最后那个是读写的。

下面以一个例子来进行说明:

#include <QDebug>

int main(int argc, char *argv[])
{
    QMap<QString, QString> map;
    map.insert("beijing""111");
    map.insert("shanghai""021");
    map.insert("tianjin""022");
    map.insert("chongqing""023");
    map.insert("jinan""0531");
    map.insert("wuhan""027");   

QMap<QString, QString>::const_iterator i;
    for( i=map.constBegin(); i!=map.constEnd(); ++i)
        qDebug() << i.key() <<"        " << i.value();   
       
    QMap<QString, QString>::iterator mi;
    mi = map.find("beijing");
    if(mi != map.end())
        mi.value() = "010";
    QMap<QString, QString>::const_iterator modi;
    qDebug() << "";
    for( modi=map.constBegin(); modi!=map.constEnd(); ++modi)
        qDebug() << modi.key() <<"        " << modi.value();   
    return 0;
}

转载于:https://www.cnblogs.com/senior-engineer/p/8287362.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业机器人滑膜变结构控制技术_机器人智能滑模变结构控制方法的研究

学校代号 10532 学 号 S150900769 分 类 号 TP241 密 级 公开 硕士学位论文 机器人智能滑模变结构控制方法的研究 学位申请人姓名 张爱林培 养 单 位 电气与信息工程学院导师姓名及职称 谢宏 副教授学 科 专 业 控制科学与工程 研 究 方 向 控制理论与控制工程论 文 提 交 日 期…

邬贺铨:工业互联网的网络技术

来源&#xff1a;工业互联网产业联盟在2020工业互联网大会开幕式上&#xff0c;中国工程院院士邬贺铨发表题为《工业互联网的网络技术》的主旨演讲&#xff0c;从工业互联网物理层技术、链路层技术、网络层技术三个方面&#xff0c;对现有通信网络如何满足工业互联网高速发展要…

NGINX下配置CACHE-CONTROL

转载的&#xff0c;那个页面让关了&#xff0c;&#xff0c;没标明请谅解。 HTTP协议的Cache -Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会影响另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-a…

无返回值_只需一步,在Spring Boot中统一Restful API返回值格式与处理异常

统一返回值在前后端分离大行其道的今天&#xff0c;有一个统一的返回值格式不仅能使我们的接口看起来更漂亮&#xff0c;而且还可以使前端可以统一处理很多东西&#xff0c;避免很多问题的产生。比较通用的返回值格式如下&#xff1a;public class Result { // 接口调用成功或者…

什么是边缘计算(Edge AI)?

来源&#xff1a;万物智能视界边缘AI发源于边缘计算。边缘计算也称为边缘处理&#xff0c;是一种将服务器放置在本地设备附近网络技术, 这有助于降低系统的处理负载&#xff0c;解决数据传输的延迟问题。这样的处理是在传感器附近或设备产生数据的位置进行的&#xff0c;因此称…

VUE全局api

一、什么是全局API&#xff1f; 全局API并不在构造器里&#xff0c;而是先声明全局变量或者直接在Vue上定义一些新功能&#xff0c;Vue内置了一些全局API&#xff0c;比如我们今天要学习的指令Vue.directive。说的简单些就是&#xff0c;在构造器外部用Vue提供给我们的API函数来…

vts传感器采取船舶的_智慧船舶交通管理系统

技术参数1、信息处理单台服务器水上目标(含移动和静止目标)实时处理容量≥10000个&#xff0c;可扩展。2、二三维显示性能单个工作台上显示水上目标数&#xff1a;10000个。3、VTS雷达录取点迹处理能力≥2000点/s。航迹处理能力≥1000批/转(22转/min)。航迹处理延时≤1s。功能描…

美国运通使用AI技术检测欺诈行为 增强安全性

来源丨Forbes编译丨科技行者多年以来&#xff0c;美国运通一直是人工智能与认知技术领域的领导者。作为坐拥有庞大忠实客户群体的全球金融服务机构&#xff0c;保障客户账户安全一直是运通职能的重中之重。在很长一段时间里&#xff0c;发现并制止欺诈行为一直是美国运通公司的…

未来趋势?通过无线技术管理汽车电池,可消除90%物理布线

电动汽车的电池寿命要求远比手机电池要高。来源 | 雷锋网作者 | 伍文靓雷锋网按&#xff0c;当智能手机中的电池损耗殆尽&#xff0c;无法满足正常使用的续航体验时&#xff0c;用户往往会选择换一台新的设备&#xff0c;以此来解决问题。这是十分常规的操作。然而&#xff0c…

MySQL ERROR 1045 (28000): Access denied for user 'root'@'192.168.23.224' (using password: YES)

出现如题错误可能原因&#xff1a; 1、密码有误。检查密码是否与 mysql.user 中 root 用户对应密码一致&#xff08;我就是这个原因&#xff0c;被折磨整个下午和晚上&#xff09; 2、用户 root 没有授权&#xff0c;授权命令如下&#xff1a; grant all on *.* to root% ident…

nacos 怎么配置 里的配置ip_nacos集群配置

一、环境准备Nacos 依赖 java环境来运行。如果您是从代码开始构建并运行Nacos&#xff0c;还需要为此配置 Maven环境&#xff0c;请确保是在以下版本环境中安装使用:64 bit OS&#xff0c;支持 Linux/Unix/Mac/Windows&#xff0c;推荐选用 Linux/Unix/Mac。64 bit JDK 1.8&…

RF MEMS开关时代将开启?

来源&#xff1a;内容编译自「IEEE」&#xff0c;谢谢。二十年前&#xff0c;专门研究射频电路的工程师设想了一种“理想的开关”。这种开关“打开”时&#xff0c;它将具有超低电阻&#xff0c;“关闭”时将具有超高电阻等等。它体积小巧&#xff0c;快速&#xff0c;易于制造…

BZOJ3245: 最快路线 拆点dijkstra

150个点&#xff0c;500种速度&#xff0c;乘起来大概8e4个点&#xff0c;3e4的边 其他题解写的基本都是spfa&#xff0c;想想dij也能做&#xff0c;还挺快 #include<bits/stdc.h> //#pragma comment(linker, "/STACK:1024000000,1024000000") #include&l…

3dmax体积雾渲染不出来_【扮家家云渲染效果图】3Dmax体积光制作丛林光束|干货教程...

首先打开场景文件场景中创建了一些树木组成了森林的效果。首先要为场景创建灯光。单击创建&#xff0c;选择灯光&#xff0c;将类型切换为标准。接着单击目标平行光。在场景中拖拽进行创建&#xff0c;创建一盏目标平行光&#xff0c;然后单击修改&#xff0c;勾选阴影&#xf…

干货 | 机器人视觉三维成像技术全解析

来源&#xff1a;机器人创新生态在工业4.0时代&#xff0c;国家智能制造高速发展&#xff0c;传统的编程来执行某一动作的机器人已经难以满足现今的自动化需求。在很多应用场景下&#xff0c;需要为工业机器人安装一双眼睛&#xff0c;即机器人视觉成像感知系统&#xff0c;使机…

61二叉搜索树的第k个结点

题目描述 给定一颗二叉搜索树&#xff0c;请找出其中的第k大的结点。例如&#xff0c; 5 / \ 3 7 /\ /\ 2 4 6 8 中&#xff0c;按结点数值大小顺序第三个结点的值为4。思路&#xff1a;二叉搜索树的中序遍历是递增的序列&#xff0c;使用循环的中序遍历找到第k个节点就行了&am…

python海龟绘图_Python教学案例|海龟绘图三例

说明&#xff1a;海龟绘图网上的案例非常多&#xff0c;网上百度一搜就可以找到各种各样的不同绘图参考代码&#xff0c;简单的有&#xff0c;难的有绘制梵高画、九大行星图等等&#xff0c;有需求的最好问度娘&#xff0c;简单又方便。分享Python 基础教程:https://www.runoob…

后香农时代,华为提出10大数学挑战问题

来源&#xff1a;机器之心编辑&#xff1a;杜伟后香农时代的通信技术会如何发展&#xff1f;又有哪些值得业界关注的数学问题呢&#xff1f;在上月底结束的长沙「数学促进企业创新发展论坛」上&#xff0c;华为董事、战略研究院院长徐文伟抛出了后香农时代信息产业发展面临的了…

Oracle中如何查询一个表的所有字段名和数据类型

Oracle中如何查询一个表的所有字段名和数据类型 查询语法 select A.COLUMN_NAME,A.DATA_TYPE from user_tab_columns A where TABLE_NAME表名 查询例子 select A.COLUMN_NAME,A.DATA_TYPE from user_tab_columns A where TABLE_NAMEPUB_GOODS 添加排序后例子 select A.COLUMN…

wdcp mysql远程_CentOS下WDCP下的MYSQL开启远程连接

在 Windows 主机中点击开始菜单&#xff0c;运行&#xff0c;输入“cmd”&#xff0c;进入控制台&#xff0c;然后cd 进入MySQL 的 bin 目录下&#xff0c;然后输入下面的命令。> MySQL -uroot -p123456 (123456 为 root 用户的密码。)如何开启MySQL的远程帐…