关闭

第37课 - 深度解析 QMap 与 QHash

标签: qt
1608人阅读 评论(0) 收藏 举报
分类:

1、QMap深度解析

  • QMap 是一个以升序键存储键值对的数据结构
  • QMap 原型为class QMap<K, T> 模板
  • QMap 中的键值对根据 Key 进行了排序
  • QMap 中的Key类型必须重载 operator <
微笑往QMap里面插入的数据,会自动根据key值得大小按照升序的方式自动排序,并且QMap的每个元素是一个键值对,即一个键值key对应一个值value。)



2、QMap的使用示例

示例1:
    QMap<QString, int> map;

    map.insert("Key 2", 2);
    map.insert("Key 0", 0);
    map.insert("Key 1", 1);

    for(int i=0; i<3; i++)
    {
        qDebug() << map.value("Key " + QString::number(i));
    }

    QList<QString> list = map.keys();

    for(int i=0; i<list.count(); i++)
    {
        qDebug() << list[i];
    }


示例2:
    QMap<QString, int> map;

    map["Key 2"] = 2;
    map["Key 0"] = 0;
    map["Key 1"] = 1;

    for(int i=0; i<3; i++)
    {
        qDebug() << map["Key " + QString::number(i)];
    }

    QMapIterator<QString, int> it(map); // it指向的是第一个元素之前的位置

    while( it.hasNext() )
    {
        it.next();
        qDebug() << it.key() << " : " << it.value();
    }




微笑QMapIterator<QString, int> it(map);  定义一个QMap的迭代器it,这句话之后,it指向QMap元素的前一个位置。在while循环里面,判断it的下一个位置是否为空,然后进行具体操作。)

 

3、QMap的注意事项

  • 通过Key获取Value的时候:
  • - 当Key存在,返回对应的Value
  • - 当Key不存在,返回值类型对应的“零”
  • 插入键值对时:
  • - 当Key存在,更新Value的值
  • - 当Key不存在,插入新的键值对

  

4、QHash深度解析

  • QHash是Qt中的哈希数据结构
  • - QHash原型为class QHash<K, T> 模板
  • - QHash中的键值对在内部无序排列
  • - QHash中的Key类型必须重载 operator ==
  • - QHash中的Key对象必须重载全局哈希函数qHash()

5、QHash使用示例

    QHash<QString, int> hash;

    hash["Key 2"] = 2;
    hash["Key 3"] = 3;
    hash["Key 1"] = 1;

    for(int i=1; i<4; i++)
    {
        qDebug() << hash["Key " + QString::number(i)];
    }

    hash.insert("Key 0", 0);

    QHash<QString, int>::const_iterator i;

    for(i=hash.constBegin(); i!=hash.constEnd(); ++i)
    {
        qDebug() << i.key() << " : " << i.value();
    }



(QHash其实在使用上和QMap是一样一样的!)
上面结果为1 2 3 ,是因为根据key 1 key 2 key 3 的顺序来访问的。
下面正好是顺序的,但是并不能说明什么?


6、QMap和QHash对比分析

  • QMap和QHash的接口相同,可以直接替换使用
  • -QHash的查找速度明显快于QMap
  • -QHash占用的存储空间则明显多于QMap
  • QHash以任意的方式存储元素
  • QMap以Key顺序存储元素
  • QHash的键类型必须提供operator ==()和qHash(key)函数
  • QMap的键类型必须提供operator <()函数


7、NotePad编程实验

问题描述:NotePad记事本有一个小BUG,就是在保存文件的时候,如果没有指定保存文件的后缀的时候,保存的文件就没有后缀名。
问题解决:使用QMap或者QHash,由于要求不高,所以我们就是用QMap
问题一定为
QString MainWindow::showFileDialog(QFileDialog::AcceptMode mode, QString title)
{
    QString ret = "";

    QFileDialog fd(this);
    QStringList filters;

    filters.append("Text Files (*.txt)");
    filters.append("All Files (*)");

    fd.setWindowTitle(title);
    fd.setAcceptMode(mode);

    if( mode == QFileDialog::AcceptOpen )
    {
        fd.setFileMode(QFileDialog::ExistingFile);
    }

    fd.setFilters(filters);

    if( fd.exec() == QFileDialog::Accepted )
    {
        ret = fd.selectedFiles()[0];
    }

    return ret;
}
由于ret = fd.selectedFiles()[0];保存的文件不含有后缀名,所以我们需要判断,如果用户在输入保存的文件名的时候,如果没有输入文件后缀名则自动为其加上后缀名,如果加了就什么都不做。那么应该怎么做呢?这就需要用到QMap或者QHash了,因为他们保存的是键值对,正好可以将filters和后缀名对应上,方便为没加上后缀名的文件自动加上后缀名。

具体代码:
QString MainWindow::showFileDialog(QFileDialog::AcceptMode mode, QString title)
{
    QString ret = "";
    QFileDialog fd(this);
    QStringList filters;
    QMap<QString, QString> map;
    const char* filterArray[][2] =     // 定义键值对的二维数组
    {
        {"Text Files (*.txt)", ".txt"},
        {"All Files (*)",      "*"   },
        {NULL,                 NULL  }
    };

    for(int i=0; filterArray[i][0]!=NULL; i++)
    {
        filters.append(filterArray[i][0]);                // 添加filters
        map.insert(filterArray[i][0], filterArray[i][1]); // 关联QMap的键值对
    }

    fd.setWindowTitle(title);
    fd.setAcceptMode(mode);
    fd.setFilters(filters);

    if( mode == QFileDialog::AcceptOpen )
    {
        fd.setFileMode(QFileDialog::ExistingFile);
    }

    if( fd.exec() == QFileDialog::Accepted )
    {
        ret = fd.selectedFiles()[0];

        if( mode == QFileDialog::AcceptSave ) // 如果是保存模式的话,才需要自动添加后缀
        {
            QString postfix = map[fd.selectedFilter()];// 得到选择的文件的后缀

            if( (postfix != "*") && !ret.endsWith(postfix) ) // 如果后缀不是*,并且ret的后缀不是postfix的话
            {
                ret = ret + postfix;
            }
        }
    }

    return ret;
}



问题结果:小BUG解决!!



0
0
查看评论

C++ STL中Map的按Key排序和按Value排序

C++ STL中Map的按Key排序和按Value排序, 实用方法小结!
  • IIcyZhao
  • IIcyZhao
  • 2013-09-22 18:29
  • 48312

QT QMap介绍与使用

Qt中的QMap介绍与使用,在坛子里逛了一圈,发现在使用QMap中,出现过很多的问题,Map是一个很有用的数据结构。它以“键-值”的形式保存数据。在使用的时候,通过提供字符标示(键)即可得到想要的数据。这个“数据”即可以是一个字符串,也可以是任意对象,当然也包括自己定义的类对象。说明:map是以值传...
  • markely
  • markely
  • 2012-10-10 13:05
  • 29588

QT——QMap

The QMap class is a template class that provides a red-black-tree-based dictionary. QMap类一个提供基于红黑树词典的模板类。 QMap is one of Qt's generic containe...
  • u012627502
  • u012627502
  • 2014-05-30 00:49
  • 3315

QMap与QHash类

QMap和QHash都是Qt里面的容器类,一般用来作为字典查询,索引使用,两者有着相似的用法和功能。     两者的不同点在于:     1. 在查找搜索的速度上, QHash比QMap要快;在算法复杂性度量上,QMap的搜索是O(logn),而QHash...
  • Lutx
  • Lutx
  • 2011-12-28 13:49
  • 6614

Qt容器之QVector,QMap,QHash,QList等注意事项

最近做项目,写了一个tablewidget显示从服务器获取到的数据。为了更加人性化,要求服务器人员把数据排序,而我在本地用QMap进行存储然后显示,主要是考虑存储在本地的数据可能要按照一定的关键字进行搜索。但最后发现,显示出来的东西并没有按照期盼的进行排序,后来才发现QMap在存储的时候是按照主键进...
  • L_yangliu
  • L_yangliu
  • 2015-05-17 20:23
  • 3735

在共享内存中实现hash表

最近需要在php的共享内存之间使用kv存东西,找了一个开源的hashtable,挺实用的: lhttp://www.qdecoder.org/qlibc/reference/qlibc/qhasharr_8c.html
  • durbin86
  • durbin86
  • 2013-04-27 16:51
  • 1291

Qt容器(QMap/QHash etc)遍历

Qt 的容器类提供了两种风格的遍历器:Java 风格和 STL 风格。 Java 风格的遍历器 Java 风格的遍历器是在 Qt4 首先引入的,是 Qt 应用程序首先推荐使用的形式...
  • luols
  • luols
  • 2014-01-14 16:57
  • 20154

QT容器类

QT不仅支持C++的STL模板库,同时自己也定义了一套容器类和与之操作的算法类,使用QT定义的这一套库,可以使在各个平台的表现相同。QT的这些容器被设计为更轻便,更安全和更容易使用。容器类是隐含共享(implicitly)的,可重入(reentrant)的和线程安全的。为容器遍历提供了两种迭代器(j...
  • xuguangsoft
  • xuguangsoft
  • 2013-01-17 18:53
  • 32481

QT QMap 使用方法实例

QT QMap 使用方法,直接上例子,请仔细体会。
  • leoeitail
  • leoeitail
  • 2017-07-07 14:06
  • 3201

QMap的基本使用

http://blog.csdn.net/tyuttjx/article/details/7585166 1. 基本应用 下面以“键-值”都是QString的例子说明QMap的基本使用方法。 #include #include using namespace std; ...
  • tianzhijiaozi19
  • tianzhijiaozi19
  • 2016-10-24 21:05
  • 1038
    个人资料
    • 访问:28183次
    • 积分:987
    • 等级:
    • 排名:千里之外
    • 原创:70篇
    • 转载:8篇
    • 译文:0篇
    • 评论:4条
    最新评论