一、遍歷QMap容器
QMap的特點是它是一種有序的鍵值對容器。我們可以按照鍵的順序遍歷所有的鍵值對,使用QMap的foreach循環即可。
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
foreach(QString key, map.keys())
{
qDebug() << key << ":" << map.value(key);
}
輸出結果為:
one : 1 three : 3 two : 2
可以看到,QMap會按照鍵的順序進行遍歷,輸出的結果是有序的。
二、遍歷QMap的key
有時候我們只需要遍歷QMap的鍵,不需要訪問每個鍵對應的值,這時候可以使用QMap::keys()函數獲取所有鍵的列表,然後使用foreach循環遍歷。
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
foreach(QString key, map.keys())
{
qDebug() << key;
}
輸出結果為:
one three two
三、遍歷QMap 修改value
有時候我們需要在遍歷QMap的過程中修改它的值。這時候不能直接修改值,因為QMap使用的是內部節點結構,直接修改值可能導致節點結構不一致,影響QMap的使用。
一種可行的方法是使用QMap::iterator。
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
for(QMap<QString, int>::iterator it = map.begin(); it != map.end(); ++it)
{
QString key = it.key();
int value = it.value();
if(key == "two")
{
it.value() = 20;
}
qDebug() << key << ":" << value;
}
輸出結果為:
one : 1 three : 3 two : 20
可以看到,我們使用QMap::iterator遍歷QMap,然後使用迭代器的value()函數修改值。
四、遍歷Map的幾種方式
在遍歷QMap的過程中,也可以使用STL中的算法庫來進行遍歷。
例如,使用std::for_each和Lambda表達式:
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
std::for_each(map.begin(), map.end(), [](QMap<QString, int>::value_type pair){
qDebug() << pair.first << ":" << pair.second;
});
輸出結果與上面的例子一樣。
還可以使用std::transform和std::ostream_iterator來將QMap輸出到流中:
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
std::transform(map.constBegin(), map.constEnd(), std::ostream_iterator<std::pair<QString, int>>(std::cout, ", "), [](QMap<QString, int>::value_type pair){
return pair;
});
輸出結果為:
("one", 1), ("three", 3), ("two", 2),
五、遍歷QMap中所有的key
有時候我們需要查找QMap中的某一個key是否存在,可以使用QMap::contains()函數來檢查。也可以遍歷QMap的所有鍵,然後查找。
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
QString keyToFind = "two";
bool foundKey = false;
foreach(QString key, map.keys())
{
if(key == keyToFind)
{
foundKey = true;
break;
}
}
if(foundKey)
{
qDebug() << keyToFind << "found";
}
else
{
qDebug() << keyToFind << "not found";
}
輸出結果為:
two found
六、遍歷QMap中所有的key qt
QMap類提供了一個keys()函數,可以返回一個QList類型的所有key列表。下面的例子演示了如何使用QList的一些基本函數,在遍歷QMap中所有的key時,更好地操作數據。
QMap<QString, QString> map;
map.insert("one", "1");
map.insert("two", "2");
map.insert("three", "3");
foreach(QString key, map.keys())
{
QString value = map.value(key);
qDebug() << key << ":" << value;
}
QList<QString> keys = map.keys();
QString keyToFind = "two";
if(keys.contains(keyToFind))
{
qDebug() << keyToFind << "found";
}
else
{
qDebug() << keyToFind << "not found";
}
keys.removeOne(keyToFind);
foreach(QString key, keys)
{
QString value = map.value(key);
qDebug() << key << ":" << value;
}
keys.clear();
foreach(QString key, keys)
{
qDebug() << key;
}
輸出結果為:
one : 1 three : 3 two : 2 two found one : 1 three : 3
七、遍歷QMap中所有的key提示second不是成員
使用QMap::iteretor雖然方便,但是會提示“’second’ is not a member of QMap::iterator”錯誤,這是因為QMap::iterator是QMap::value_type類型的迭代器,而value_type是一個鍵值對類型。
解決這個問題的方法是在使用迭代器的時候,使用QMap::iterator::value()函數來獲取值。
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
for(QMap<QString, int>::iterator it = map.begin(); it != map.end(); ++it)
{
QString key = it.key();
int value = it.value();
if(key == "two")
{
it.value() = 20;
}
qDebug() << key << ":" << value;
}
輸出結果與前面的例子一樣。
八、QMap取值
獲取QMap中某一個key對應的value,有兩種方法。
一種是使用QMap::value()函數:
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
int value = map.value("two", -1);
qDebug() << value;
輸出結果為:
2
還可以使用QMap::operator[]運算符:
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
int value = map["two"];
qDebug() << value;
輸出結果為:
2
九、QMap迭代器遍歷
QMap提供了兩個類型的迭代器:QMap::const_iterator和QMap::iterator,常量迭代器用於遍歷QMap時只能讀取值,而非常量迭代器用於修改QMap中的值。
使用QMap::const_iterator類型的迭代器:
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
for(QMap<QString, int>::const_iterator it = map.constBegin(); it != map.constEnd(); ++it)
{
QString key = it.key();
int value = it.value();
qDebug() << key << ":" << value;
}
輸出結果與前面的例子一樣。
使用QMap::iterator類型的迭代器:
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
for(QMap<QString, int>::iterator it = map.begin(); it != map.end(); ++it)
{
QString key = it.key();
int value = it.value();
if(key == "two")
{
it.value() = 20;
}
qDebug() << key << ":" << value;
}
輸出結果與前面的例子一樣。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/285046.html
微信掃一掃
支付寶掃一掃