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