关闭

第37课 - 深度解析 QMap 与 QHash

标签: qt
777人阅读 评论(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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16011次
    • 积分:751
    • 等级:
    • 排名:千里之外
    • 原创:60篇
    • 转载:8篇
    • 译文:0篇
    • 评论:1条
    最新评论