第37课 - 深度解析 QMap 与 QHash

原创 2017年01月03日 20:50:04

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解决!!



版权声明:本文内容由博主所有,未经博主允许不得转载。

相关文章推荐

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

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

QT——QMap

The QMap class is a template class that provides a red-black-tree-based dictionary. QMap类一个提供基于红黑树词...

QMap与QHash类

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

QT QMap介绍与使用

Qt中的QMap介绍与使用,在坛子里逛了一圈,发现在使用QMap中,出现过很多的问题,Map是一个很有用的数据结构。它以“键-值”的形式保存数据。在使用的时候,通过提供字符标示(键)即可得到想要的数据...
  • markely
  • markely
  • 2012年10月10日 13:05
  • 26118

Qt:QHash和QMap区别

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

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

最近做项目,写了一个tablewidget显示从服务器获取到的数据。为了更加人性化,要求服务器人员把数据排序,而我在本地用QMap进行存储然后显示,主要是考虑存储在本地的数据可能要按照一定的关键字进行...

哈希排序

转自:http://wenku.baidu.com/view/c8ca9533b90d6c85ec3ac6db.html 文档下载:http://download.csdn.net/detail/t...

QMap与QHash

 关联容器可以保存任意多个具有相同类型的项,且它们由一个键索引。Qt提供两个主要的关联容器类:QMap和QHash。     QMap是一个以升序键顺序存储键值对的数据结构。这种排列使它可以提供良好的...
  • bbjjqq
  • bbjjqq
  • 2010年12月30日 18:02
  • 14924

QT QHash 使用方法实例

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

QHash的使用

开发环境: QT 5.0.2  MinGW 32bit 这里主要讨论key为QString,value为结构体指针类型的QHash。例如: QHashQString, QUserInfo*>...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第37课 - 深度解析 QMap 与 QHash
举报原因:
原因补充:

(最多只允许输入30个字)