QHash & QMap 的顺序问题 (***)

2023-11-19

QT关联容器QMap,QHash的Key值自动排序问题 (**)

对QMap中的key进行自定义排序 (***)

如何取消QMap自动排序,让QMap按照插入的顺序排列? (***)

通过插入顺序循环QHash

QMap,QHash插入后的显示顺序以及记录插入顺序的数据结构 (***)

基本框架 - QT常见数据结构:QString、QList、QVector、QMap、QHash、QSet、QPair快览

------------------------------------------------------------

要点:

1. QList<QPair<QString,QString>> pairs;

2. 改变QMap的key的排序规则,则需要提供operator<()

3. 其他数据结构

4. 实现按照自定义的 插入顺序

问题:QMap,QMultiMap均为关联容器,按照 key的 unicode码排序,无法自定义。

好像 map也可以实现多键值?

QList 可自定义顺序;但修改、替换、检索之类的操作,不同场景,不同方便?

在处理键值对这类场景中,QList似乎麻烦,没有对应关系,维护困难,容易产生错误。

QT List链表用法

使用 QMultiMap类,用数字作为排序的键值。

使用数字 key的 一个值作为 真实的键值,另一个作为 真实的值,

需要以下辅助:

不重复的 key总数,以及第一和最后一个key (***)
uniqueKeys / firstKey ~lastKey

        qDebug()<<" uniqueKeys :: "<<multiMap.uniqueKeys(); //uniqueKeys :: (1, 2, 3)
        qDebug()<<" lastKey :: "<<multiMap.lastKey(); //此时为 数字 number.  lastKey :: 3
        qDebug()<<" firstKey :: "<<multiMap.firstKey(); // firstKey :: 1

参考:

如何获得 multimap的中的key的数目 (**)
https://blog.csdn.net/ken2232/article/details/132061050

QHash & QMap 的顺序问题 (***)
https://blog.csdn.net/ken2232/article/details/132051508

------------------------------------------------------------

参考:

C++中operator关键字(重载操作符)

  https://blog.csdn.net/ken2232/article/details/132053793

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

QMap,QHash插入后的显示顺序以及记录插入顺序的数据结构 (***)

1、QMap 插入后再遍历是:按照 key的顺序来排序的(汉字除外,汉字的排序顺序很奇怪,不是正常的字母顺序);

2、QHash插入后再遍历是 没有顺序的;

3、如果想按照插入顺序记录,可使用这样的结构:

QList <QPair <QString,QString>> pairs;

可以用这样的方式取数据:

    QString firstValue=pairs.at(0).first;
    QString secondValue=pairs.at(0).second;

————————————————
版权声明:本文为CSDN博主「想飞的兔子呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012613604/article/details/78719570

如何取消QMap自动排序,让QMap按照插入的顺序排列?

简单实现:

#ifndef SEQUENTIALMAP
#define SEQUENTIALMAP
#include <QMap>
#include <QList>
template <class Key, class T>
class SequentialMap : public QMap<Key,T>
{
public:
    T &operator[](const Key &key){
        if(_keys.contains(key) == false){
            this->_keys.append(key);
        }
        return QMap::operator [](key);
    }

    //-----------------------------------------------------
    const T operator[](const Key &key) const{
        return QMap::operator [](key);
    }

    //===================
    QList<Key> keys() const{
        return _keys;
    }
private:
    QList<Key> _keys;
};


#endif // SEQUENTIALMAP发布于 2021-07-10 15:18

  https://www.zhihu.com/question/440927722

[QT编程系列-22]:基本框架 - QT常见数据结构:QString、QList、QVector、QMap、QHash、QSet、QPair快览

3. QPair和QMap比较

QPair和QMap是Qt中的两个不同的容器类,用于不同的目的。

QPair是一个用于存储两个值的通用容器类。它适用于需要将两个不同类型的值组合在一起的情况,但不提供键值对的查找和排序等功能。通过QPair,你可以方便地访问和操作这两个值,但无法根据键进行查找或按键排序。

相比之下,QMap是一个关联容器类,用于存储键值对。它提供了基于键的查找和插入操作,并可以按键进行排序。QMap可以根据键快速检索对应的值,并提供了按键排序的功能,因此在需要根据键进行查找和排序的情况下,QMap更适合使用。

如果你需要存储键值对并且希望可以根据键进行查找和排序,那么应该选择使用QMap。如果只是简单地需要将两个不同类型的值组合在一起,而不涉及到查找和排序,那么QPair就足够了。

需要根据具体的需求来选择使用QPair还是QMap,它们各自在不同的场景下具有不同的优势和用途。
————————————————
版权声明:本文为CSDN博主「文火冰糖的硅基工坊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/HiWangWenBing/article/details/131750604

QT关联容器QMap,QHash的Key值自动排序问题  (**)

QT关联容器根据key -> value映射, 元素根据 key值大小排序,与插入顺序无关。

1. QMap  自动排序

2. QHash 速度更快

  https://www.cnblogs.com/nxzwcx/p/7471458.html

对QMap中的key进行自定义排序  (***)

QMap的默认排序是按照key的升序进行排序。

如果我们想改变QMap的key的排序规则,则需要提供operator<()

    QMap’s key type must provide operator<(). QMap uses it to keep its items sorted, and assumes that two keys x and y are equal if neither x < y nor y < x is true.

Qt帮助文档给的例子:

 #ifndef EMPLOYEE_H
  #define EMPLOYEE_H

  class Employee
  {
  public:
      Employee() {}
      Employee(const QString &name, const QDate &dateOfBirth);
      ...

  private:
      QString myName;
      QDate myDateOfBirth;
  };

  

  inline bool operator<(const Employee &e1, const Employee &e2)
  {
      if (e1.name() != e2.name())
          return e1.name() < e2.name();
      return e1.dateOfBirth() < e2.dateOfBirth();
  }

  #endif // EMPLOYEE_H

也可以把operator<写成类成员函数。

自己写的一个例子:

在Qt中新建一个控制台程序:

main.cpp中

#include <QCoreApplication>
#include <QMap>
#include <QDebug>

class MyString
{
public:
    explicit MyString(const QString &str_) : str(str_) {}

    QString str;
    //重载操作符
    bool operator < (const MyString& other) const
    {
        return str > other.str;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QMap<MyString,int> stringMap;
    //初始化数据
    //数据插入容器
    stringMap.insert(MyString("aa"), 4);
    stringMap.insert(MyString("bb"), 3);
    stringMap.insert(MyString("cc"), 2);
    stringMap.insert(MyString("dd"), 1);

    QMapIterator<MyString, int> iter(stringMap);
    while (iter.hasNext()) {
        iter.next();
        qDebug() << iter.key().str << ": " << iter.value() << Qt::endl;
    }

    return a.exec();
}

运行结果:

就变成了key是按照QString进行降序排列。

如果代码改成这样:

class MyString
{
public:
    explicit MyString(const QString &str_) : str(str_) {}

    QString str;
    //重载操作符
    bool operator < (const MyString& other) const
    {
        return str < other.str;  //这里就改成小于号,QMap里的排序就成了升序和QMap<QString, int>默认排序一样了
    }
};

我再写一个按照int降序排序的例子:

#include <QCoreApplication>
#include <QMap>
#include <QDebug>

class MyInt
{
public:
    explicit MyInt(const int &value_) : value(value_) {}

    int value;
    //重载操作符
    bool operator < (const MyInt& other) const
    {
        return value > other.value;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QMap<MyInt, QString> intMap;
    //初始化数据
    //数据插入容器
    intMap.insert(MyInt(1), QString("aa"));
    intMap.insert(MyInt(2), QString("bb"));
    intMap.insert(MyInt(3), QString("cc"));
    intMap.insert(MyInt(4), QString("dd"));

    QMapIterator<MyInt, QString> iter(intMap);
    while (iter.hasNext()) {
        iter.next();
        qDebug() << iter.key().value << ": " << iter.value();
    }

    return a.exec();
}

运行结果:

 
以上只是为了让举例的代码简单明了,没有写成get和set的方式对类成员变量进行操作,在项目中建议写出get和set的方法对类成员变量进行操作。

————————————————
版权声明:本文为CSDN博主「hp_cpp」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hp_cpp/article/details/109275892

如何取消QMap自动排序,让QMap按照插入的顺序排列?

不可以的,这是由QMap底层结构决定的。

The QMap class is a template class that provides a red-black-tree-based dictionary.

上面是从Qt帮助手册摘录的QMap说明,可以看到 QMap是基于红黑树实现的。

那么,你插入的节点是要被排序的,就不可能保证插入顺序了;

办法1:

如果要保证顺序,只能使用数组、链表这类结构。

办法2:

还有一种比较复杂的方法,就是根据你具体的业务,设计一个符合结构。

比如,你的业务中插入、查询和修改较多,删除操作较少,可以把Value和Key分别放在两个容器里面,每次插入数据的时候,引入一个当前的序列号Number:

QHash<Key, Number> keyHash;

QMap<Number, Value> valueMap;

这样valueMap可以保证按照插入顺序浏览,查询的时候通过keyHash找到key->Number,然后,使用Number在valueMap中找到对应的值。

这样做的好处是,当列表比较大的时候,查询效率会比直接使用数组链表更高;

坏处是耗费2倍的资源,并且插入和删除需要对两个容器操作和同步,维护效率更低。

办法3:。。。。

发布于 2021-01-24 15:18

  链接:https://www.zhihu.com/question/440927722/answer/1695069460

通过插入顺序循环QHash

QHash不记得您的插入顺序。

它专为快速随机访问而设计。您使用迭代器获得的顺序是任意的

如果你只有在QHash插入元素(无元素删除),你可以并行使用一个数组/列表。这不是一个非常优雅的解决方案,但是您只需要QHash容器就无法达到您想要的效果。

  http://cn.voidcc.com/question/p-nbuhitgv-kk.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QHash & QMap 的顺序问题 (***) 的相关文章

随机推荐

  • Qt stylesheet border-color属性,QFontMetrics Class

    一 border color border color 属性设置四条边框的颜色 此属性可设置 1 到 4 种颜色 border color 属性是一个简写属性 可设置一个元素的所有边框中可见部分的颜色 或者为 4 个边分别设置不同的颜色 请
  • 程序员常用命令集,只收集名字 ^^

    export PATH home hanmeimei local bin PATH which ls file helloworld objdump help objdump h s d exit o ldd helloworld ulim
  • ROS里程计:navigation/Tutorials/RobotSetup/Odom

    ROS里程计 navigation Tutorials RobotSetup Odom 通过ROS发布里程表信息 1 通过ROS发布里程表信息 2 nav msgs Odometry消息 3 使用tf发布Odometry转换 4 编写代码
  • IDEA中web项目c3p0-config.xml文件的配置及存放目录

    IDEA中web项目c3p0 config xml文件的配置及存放目录 今天在IDEA上折腾了很长一段时间 始终连接不上数据库 日志总是说找不到mysql 这是我的测试代码 Test public void fun2 throws SQLE
  • windows下java swt实现操作redis的客户端工具

    原文 windows下java swt实现操作redis的客户端工具 源代码下载地址 http www zuidaima com share 1902705862708224 htm redisclient 1 0 正式发布 适用于多个 R
  • ip广播系统服务器软件,【网络广播服务器软件IP网络广播软件数字广播软件】 - 太平洋安防网...

    参数说明 品牌 万凯wankai 详细描述 具备 版权局颁发的计算机软件 标准TCP IP网络协议 安装于连接以太网的计算机 IP广播的网络终端具有 立的ID号与IP地址 可以单 接收服务器的个性化定时播放节目 定时播放的操作 可以通过电脑
  • Hibernate之inverse和cascade详解

    继Hibernate学习笔记整理之后 发现inverse和cascade这两个属性在配置过程中比较含糊 仔细比较一下是有些地方比较像 所以很容易搞糊涂 借助此文来阐述下inverse和cascade的区别 什么是inverse 默认值为fa
  • centos8安装postgresql步骤

    1 安装源 1 sudo yum y install epel release 2 postgresql官网发布的postgresql对应的安装源 sudo yum install y https download postgresql o
  • There are multiple modules with names that only differ in casing.

    问题 在 npm run dev 后 控制台出现警告 没有出现链接 但是在浏览器上直接输入地址http localhost 8080 又可显示界面 There are multiple modules with names that onl
  • 华为机试HJ55 挑7

    HJ55 挑7 Python 题目 解题思路 代码 结果 题目 解题思路 1 多组输入 需要循环 2 循环查找到输入数值即可 字符串查找用in 能否整除 求余后判断是否 0 3 最后打印找到的数字的列表长度 代码 def func n in
  • 逐行对比LLaMA2和LLaMA模型源代码

    几个小时前 2023年7月18日 Meta发布了允许商用的开源模型LLaMA2 笔者逐行对比了LLaMA2模型源代码 和LLaMA相比 几乎没有改动 细节如下 是否改动 LLaMA2 LLaMA 模型整体构架 无 Transformer T
  • 面试必考真题

    1 输入一个链表 反转链表后 输出新链表的表头 package com csu marden public class Demo1 public static void main String args Node head new Node
  • 解决“17: 错误:程序中有游离的‘\240’,\302’

    参考链接 https blog csdn net asuphy article details 54602426 执行如下命令即可 sed i s o240 o302 g dy haikang test cpp
  • Invalid bound statement (not found):

    BUG描述 在执行动态SQL出现问题 原因 mapper接口中的方法名和mapper xml中的id标签不一致 解决方案 修改mapper接口中的方法名 使其对应到mapper xml中的id标签 参考资料
  • openssl的x509命令简单入门

    openssl的x509命令简单入门 openssl是一个强大的开源工具包 它能够完成完成各种和ssl有关的操作 命令说明 openssl help 会得到如下的提示 openssl Error help is an invalid com
  • 数据库常用命令之外键(foreign key)之多对一(总结,基础)

    我是小白 刚接触MySQL不久 现阶段正在学习 为此在CSDN上留下自己的学习笔记 如果有错误的地方还请大家见谅 评论或者私发我错误地方哦 谢谢大家 嘿嘿 此篇将记录外键的相关知识 上篇内容为对一张表的约束条件 传送门 创建表的完整性语法
  • golang基础教程

    目录 golang基础教程 一 环境搭建 golang基础教程 二 开发规范及API golang基础教程 三 变量与数据类型概述 golang基础教程 四 基本数据类型 golang基础教程 五 基本数据类型的转换 golang基础教程
  • 缺少nodejs环境,请在设置中配置nodejs的安装路径 - HBuilder - uniapp

    HBuilder运行uni app项目 点击 运行到 提示 缺少nodejs环境 请在设置中配置nodejs的安装路径 解决办法 找到工具 设置 运行配置 node运行配置 运行终端类型 选择 内置 外部 如果已经配置过 关闭编译器 重新打
  • Unity_如何使相机视角一直跟随角色移动

    实例代码如下 using System Collections using System Collections Generic using UnityEngine 相机视角跟踪 public class FollowTarget Mono
  • QHash & QMap 的顺序问题 (***)

    QT关联容器QMap QHash的Key值自动排序问题 对QMap中的key进行自定义排序 如何取消QMap自动排序 让QMap按照插入的顺序排列 通过插入顺序循环QHash QMap QHash插入后的显示顺序以及记录插入顺序的数据结构