QT的幾種QMap插入順序說明
1 在QMap中按順序插入QString類型的鍵
QMap本身就會(huì)自動(dòng)按鍵排序,但對(duì)于QString類型的鍵,默認(rèn)是按照字母順序(字典序)排序的。如果你需要自定義排序順序,可以通過以下幾種方法實(shí)現(xiàn):
1.1 使用默認(rèn)的字母順序排序
如果你只需要普通的字母順序排序,QMap已經(jīng)自動(dòng)實(shí)現(xiàn)了:
QMap<QString, int> map;
map.insert("banana", 2);
map.insert("apple", 1);
map.insert("cherry", 3);
// 遍歷時(shí)會(huì)自動(dòng)按字母順序輸出:apple, banana, cherry
for (auto it = map.begin(); it != map.end(); ++it) {
qDebug() << it.key() << ":" << it.value();
}1.2 自定義排序規(guī)則
如果需要自定義排序順序,可以提供一個(gè)比較函數(shù):
// 自定義比較函數(shù) - 按字符串長度排序
struct LengthCompare {
bool operator()(const QString &a, const QString &b) const {
return a.length() < b.length();
}
};
// 使用自定義比較函數(shù)的QMap
QMap<QString, int, LengthCompare> lengthOrderedMap;
lengthOrderedMap.insert("banana", 2);
lengthOrderedMap.insert("apple", 1);
lengthOrderedMap.insert("cherry", 3);
// 遍歷時(shí)會(huì)按字符串長度輸出:apple, banana, cherry1.3 保持插入順序
如果需要保持插入順序而不是排序順序,可以考慮:
方案1:使用QMap+QList組合
QMap<QString, int> map;
QList<QString> insertionOrder;
void insertInOrder(const QString &key, int value) {
if (!map.contains(key)) {
insertionOrder.append(key);
}
map.insert(key, value);
}
// 遍歷時(shí)按插入順序
for (const QString &key : insertionOrder) {
qDebug() << key << ":" << map.value(key);
}方案2:使用QHash+QList組合
QHash<QString, int> hash;
QList<QString> insertionOrder;
void insertInOrder(const QString &key, int value) {
if (!hash.contains(key)) {
insertionOrder.append(key);
}
hash.insert(key, value);
}方案3:使用Qt 5.14+的QSequentialIterable容器
#include <QSequentialIterable> // 但這不是一個(gè)獨(dú)立的容器,需要結(jié)合其他方法使用
1.4 使用第三方庫或C++17的std::map
如果你可以使用C++17,可以考慮:
#include <map> #include <string> std::map<std::string, int, YourCustomCompare> orderedMap;
總結(jié)
1. 默認(rèn)字母順序:直接使用QMap<QString, T>
2. 自定義排序:提供比較函數(shù)作為QMap的第三個(gè)模板參數(shù)
3. 保持插入順序:使用QMap+QList或QHash+QList組合
4. C++17選項(xiàng):考慮std::map with custom comparator
對(duì)于大多數(shù)情況,QMap的默認(rèn)排序行為已經(jīng)足夠,如果需要保持插入順序,組合使用QList來記錄順序是最常見的解決方案。
到此這篇關(guān)于QT的幾種QMap插入順序說明的文章就介紹到這了,更多相關(guān)QT QMap插入順序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++循環(huán)鏈表之約瑟夫環(huán)的實(shí)現(xiàn)方法
這篇文章主要介紹了C++循環(huán)鏈表之約瑟夫環(huán)的實(shí)現(xiàn)方法,對(duì)于學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法有一定的借鑒價(jià)值,需要的朋友可以參考下2014-09-09
基于C++實(shí)現(xiàn)一個(gè)Windows多功能計(jì)算器
這篇文章主要為大家詳細(xì)介紹了如何基于C++實(shí)現(xiàn)一個(gè)Windows多功能計(jì)算器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-10-10
C++類中隱藏的幾個(gè)默認(rèn)函數(shù)你知道嗎
這篇文章主要為大家詳細(xì)介紹了C++類中隱藏的幾個(gè)默認(rèn)函數(shù),使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
VS2022配置編譯使用boost庫的實(shí)現(xiàn)
本文介紹了如何在VS2022中配置和編譯使用Boost庫的步驟,包括下載Boost、解壓、配置環(huán)境變量和編譯等過程,具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12

