Qt QMap 和 QHash 的區別

QMap

  • QMap是一個以升序鍵順序存儲鍵值對的數據結構
  • QMap原型爲class QMap<key, value>
  • QMap中根據鍵值key進行的升序排序
  • QMap中key的類型必須要重載operator <操作符
  • QMap提供了一個從類項爲key的鍵到類項爲value的值的映射,通常所存儲的數據類型是一個鍵對應一個值
  • 同時也支持一鍵多值的情況,用類QMultiMap可以實現。
  • 鍵值對都可以是任意類型
  • 可以定義迭代器指向每個鍵值對元素,可以理解成一個指針
  • 通過key獲取value時:
    • 當key存在:返回對應的value
    • 當key不存在:返回value類型對應的“零值”
  • 插入鍵值對時:
    • 當key存在:更新value的值
    • 當key不存在:插入新的鍵值對

QHash

  • QHash是Qt中的哈希數據結構
  • QHash原型爲class QHash<key, value>
  • QHash的鍵值對在內部無序排列
  • QHash中的key類型必須重載operator ==操作符
  • QHash中的key對象必須重載全局的qHash()函數
  • 此類維護一張哈希表,表的大小和數據項是自適應的
  • QHash是以任意的順序存儲的數據
  • 也是可以支持一鍵多值的,用類QMultiHash可以實現。
  • 鍵值對都可以是任意類型
  • QMap和QHash的接口相同,可直接替換使用
  • 可以很方便的根據設置的鍵來獲取對應的值,查找效率高於QMap。
  • 迭代器it可以理解成一個指針,可以指向QMap對象的每個元素

兩者區別:

  • QHash的查找速度明顯快於QMap
    • 因爲QHash的排布是通過調用qhash()這個全局哈希函數後獲取的一個ID,通過調用函數後幾乎能夠立即獲取這個ID,所以其定位速度十分快;而QMap因爲是按鍵值升序排列,是使用二分查找方法進行查找的,速度會慢很多。
  • QHash佔用的存儲空間明顯多於QMap,QHash的速度是利用空間換回來的。
  • QHash以任意的方式存儲元素,因爲是通過調用qHash函數獲取ID,所以其排布是沒有規律的;QMap以key的升序順序存儲的。
  • QHash的鍵類型必須提供operator ==()和qHash()函數;QMap的鍵類型必須提供operator<()函數。所以QMap在使用上也會相對簡單一些。

QMap使用:

void QMap_Test()
{
    QMap<QString, int> map;

    map.insert("key 2", 2);//插入鍵值對
    map.insert("key 1", 1);
    map.insert("key 0", 0);
    map.insert("key 5", 5);
    map.insert("key 6", 6);
    map.insert("key 4", 4);
    map.insert("key 3", 3);

    QList<QString> klist = map.keys();//一個QMap對象的鍵值對中的鍵保存在一個QList中

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

    QList<int> vlist = map.values();//一個QMap對象的鍵值對中的值保存在一個QList中

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

    QMapIterator<QString, int> it(map);//迭代器的使用,it一開始指向的是第0個元素之前的位置
    while(it.hasNext())//根據迭代器獲取元素
    {
        it.next();
        qDebug() << it.key() << " : " << it.value();

    }
}

 

QHash使用:

void QHash_Test()
{
    QHash<QString, int> hash;

    hash.insert("key 1", 1);   
    hash.insert("key 58", 58);
    hash.insert("key 7", 7);
    hash.insert("key 45", 45);
    hash.insert("key 12", 12);
    hash.insert("key 56", 56);
    hash.insert("key 34", 34);

    QList<QString> klist = hash.keys();
    for(int i = 0; i < klist.count(); i++)
    {
        qDebug() << klist[i];
    }

    QList<int> vlist = hash.values();
    for(int i = 0; i < vlist.count(); i++)
    {
        qDebug() << vlist[i];
    }

    hash["key 44"] = 44;//通過下標方式插入
    QHash<QString, int>::const_iterator it;//迭代器的使用,it一開始指向的是第0個元素之前的位置
    for(it = hash.constBegin(); it != hash.constEnd(); ++it)
    {
        qDebug() << it.key() << " : " << it.value();
    }
}

QMap和QHash的接口函數:

  • iterator begin () 返回指向第0位置元素的迭代器
  • const_iterator begin () const 功能同上
  • void clear () 清空所有元素
  • const_iterator constBegin () const 返回指向第0位置元素的const類型的迭代器
  • const_iterator constEnd () const 返回指向最後元素的下一個假想位置的const類型的迭代器
  • const_iterator constFind ( const Key & key ) const 返回鍵key對應元素位置的const類型的迭代器
  • bool contains ( const Key & key ) const 如果存在key對應的鍵值對,返回true,否則返回false
  • int count ( const Key & key ) const 返回與Key關聯的鍵值對的數目
  • bool empty () const 是否爲空
  • iterator erase ( iterator pos ) 清除pos指向的元素
  • iterator find ( const Key & key ) 返回根據key查找得到的鍵值對的itreator
  • const_iterator find ( const Key & key ) const const版本
  • iterator insert ( const Key & key, const T & value ) 插入鍵值對,如果插入的key存在,則會替換原先的鍵值對;如果這個key關聯多個value,那麼最後插入的那個鍵值對將被覆蓋
  • iterator insertMulti ( const Key & key, const T & value ) 可以使得一個key關聯多個value
  • const Key key ( const T & value ) const 根據value獲取第一個key
  • QList <Key> keys () const
  • QList <Key> keys ( const T & value ) const
  • int remove ( const Key & key )
  • int size () const
  • T take ( const Key & key )
  • std::map <Key,T> toStdMap () const
  • QList <Key> uniqueKeys () const
  • const T value ( const Key & key ) const
  • const T value ( const Key & key, const T & defaultValue ) const
  • QList <Key> values () const
  • QList <Key> values ( const Key & key ) const

 

小結:

  • Qt中提供了用於存儲鍵值對的類模板
  • QHash和QMap遵循相同的接口
  • QHash的查找速率快於QMap
  • QMap需要的內存空間小於QHash
  • QHash對於key類型的要求高於QMap

 

 

發佈了44 篇原創文章 · 獲贊 11 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章