关于QMap的几点总结思考
關于QMap的幾點總結思考
題記:
前段時間集中精力寫了數(shù)據(jù)的分揀算法,用到了容器QMap和QMultiMap。回頭再來回去該算法的時候,又覺得當時好像不是自己寫的一樣,于是有必要將QMap類來總結一下。
首先來了解下C++中STL中的map:
map是STL的一個關聯(lián)容器,它提供一對一的hash。
特點:
- 第一個可以稱為關鍵字(key),每個關鍵字只能在map中出現(xiàn)一次;
- 第二個可能稱為該關鍵字的值(value);
map以模板(泛型)方式實現(xiàn),可以存儲任意類型的數(shù)據(jù),包括使用者自定義的數(shù)據(jù)類型。
Map主要用于資料一對一映射(one-to-one)的情況,map內(nèi)部的實現(xiàn)自建一顆紅黑樹,這顆樹具有對數(shù)據(jù)自動排序的功能。
在map內(nèi)部所有的數(shù)據(jù)都是有序的,后邊我們會見識到有序的好處。比如一個班級中,每個學生的學號跟他的姓名就存在著一對一映射的關系。
Qt 中的QMap 和c++中的map 功能等同,但用法稍有不同罷了。
QMap 的功能:
自動建立key - value的對應。key 和 value可以是任意你需要的類型,包括自定義類型。
在QMap中的自定義數(shù)據(jù)類型需要重載運算符 <
QMap 的使用:
QMap對象是模板類,需要關鍵字和存儲對象兩個模板參數(shù):
QMap<int, string> personnel;
這樣就定義了一個用int作為索引,并擁有相關聯(lián)的指向string的指針.
既然QMap是一個有序的容器。對此容器的操作無非就是增刪改查
1、插入:
//定義一個mapStudent的map數(shù)據(jù)對象 QMap<int, string> mapStudent; //insert 方式插入 mapStudent.insert(000,"student_one"); //數(shù)組“array”方式輸入 mapStudent[001] = "student_two";這里有兩種方式來插入:1、操作符 [] 2、insert 方式
注意:不管那種方式,如果前后插入的鍵值相同,那么后一個插入的數(shù)據(jù)會覆蓋前一個數(shù)據(jù)。
2、查找:
查找的方式有三總:1、操作符[] 2、contains() 3、value()
但是,我們推薦使用后兩種,因為"操作符[]" 會在找不到鍵的情況下 ,默認會插入數(shù)據(jù)。例如下面的代碼中,會創(chuàng)建1000 項目。
// WRONG
QMap<int, QWidget *> map;
…
for (int i = 0; i < 1000; ++i) {
if (map[i] == okButton)
cout << "Found button at index " << i << endl;
}
運用 contains():
int timeout = 30;
if (map.contains(“TIMEOUT”))
timeout = map.value(“TIMEOUT”);
使用value()
int timeout = map.value(“TIMEOUT”, 30);
上面兩端代碼是等價的。當找不到鍵“TIMEOUT”,將timeout變量的值賦值為30,如果找到,那就將找到的值賦值給變量timeout。
3、遍歷
Java 風格:使用QMapIterator
QMapIterator<QString, int> i(map);
while (i.hasNext()) {
i.next();
cout << i.key() << ": " << i.value() << endl;
}
STL 風格:使用 iterator
QMap<QString, int>::const_iterator i = map.constBegin();
while (i != map.constEnd()) {
cout << i.key() << ": " << i.value() << endl;
++i;
}
如果你需要將QMap中的所有的值遍歷出來,而不需要鍵也遍歷出來,可以這樣寫:
QMap<QString, int> map;
…
foreach (int value, map)
cout << value << endl;
4、刪除
1、remove(): 移除你想要給定的鍵的任何一項
2、clear() 清空對象
3、take(),移除你想要給定的鍵的任何一項,,并返回該鍵下對應的值。
5、其他操作:
1、count(const Key &key) 返回該鍵下的數(shù)據(jù)項有幾項。
2、empty() 等同于 isempty() 容器是否為空
3、keys() 返回所有鍵的列表
4、size() 返回鍵值對的數(shù)量
5、 swap(QMap<Key, T> &other) 與另一個容器map 交換
6、 take(const Key &key) 刪除該鍵下的鍵值對,并返回改建所對應的值
6、unite(const QMap<Key, T> &other) 將另一個map中的鍵值對插入到本map中。
7、QList QMap::values() const 返回值列表
8、lower_bound() 返回鍵值>=給定元素的第一個位置
9、 upper_bound() 返回鍵值>給定元素的第一個位置
總結
以上是生活随笔為你收集整理的关于QMap的几点总结思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt基于QGraphicsObject自
- 下一篇: Qt 实现数据协议控制--组帧、组包、解