一、描述
QMap<Key, T> 是 Qt 的通用容器类之一。 它存储(键,值)对并提供按键快速查找。
二、成员函数
1、QMap::const_iterator constFind(const Key &key)
返回一个 const 迭代器,该迭代器指向map中具有 key 键的项目。如果地图不包含带键的项目,则该函数返回 constEnd()。
QMap<QString, int> map;
map["one"] = 1;
map["three"] = 3;
map["seven"] = 7;
auto it = map.constFind("one");
qDebug()<<it.key()<<it.value();
2、constKeyValueBegin() 、constKeyValueEnd()
QMap<QString, int> map;
map["one"] = 1;
map["three"] = 3;
map["seven"] = 7;
for(auto it = map.constKeyValueBegin();it != map.constKeyValueEnd();++it)
qDebug()<<it->first<<it->second;
3、bool contains(const Key &key)
是否包含键。
4、 QMap::size_type count(const Key &key)
返回与键 key 关联的项目数。
5、QPair<QMap::iterator, QMap::iterator> equal_range(const Key &key)
返回两个迭代器。
迭代器1是指向当前 map 容器中第一个大于或等于 key 的键值对的迭代器(lowerBound())。
迭代器2是指向当前 map 容器中第一个大于 key 的键值对的迭代器。(upperBound())
QMap<QString, int> map;
map["one1"] = 1;
map["one2"] = 2;
map["one3"] = 3;
map["one4"] = 4;
map["one5"] = 5;
auto pair = map.equal_range("one2");
qDebug()<<(pair.first.key())<<(pair.first.value());
qDebug()<<(pair.second.key())<<(pair.second.value());
6、QMap::iterator erase(QMap::const_iterator pos)
QMap::iterator erase(QMap::const_iterator first, QMap::const_iterator last)
从映射中移除迭代器 pos 指向的 (key, value) 对,并返回指向映射中下一项的迭代器。
auto it = map.begin();
while (it != map.end())
{
if(......)
it = map.erase(it);
else
++it;
}
7、QMap::iterator find(const Key &key)
查找key,若找不到返回end()。
8、T & first() / const Key & firstKey() T & last() / const Key & lastKey()
返回map中第一个、最后一个 value / key的引用。
9、QMap::iterator insert(const Key &key, const T &value)
QMap::iterator insert(QMap::const_iterator pos, const Key &key, const T &value)
插入一个具有键 key 和 value 值的新项目。如果已经有一个带有键 key 的项目,则该项目的值将替换为 value。
void insert(QMap<Key, T> &&map)
移动map中的所有项。如果map是隐式共享的,那么项目将被复制。
10、Key key(const T &value, const Key &defaultKey = Key())
返回第一个具有 value 值的键,如果映射不包含具有 value 值的项目,则返回 defaultKey。
此函数可能很慢(O(n)),因为 QMap 的内部数据结构针对按键而不是按值进行快速查找进行了优化。
11、keyBegin() / keyEnd() keyValueBegin() / keyValueEnd()
键 / 值的迭代器。
12、QList<Key> keys()以升序返回包含映射中所有键的列表。顺序保证与 values() 使用的顺序相同。
此函数以线性时间(O(n))创建一个新列表。可以通过从 keyBegin() 迭代到 keyEnd() 来避免所需的时间和内存使用。
13、QList<Key> keys(const T &value)
返回一个列表,其中包含按升序排列的与 value 值关联的所有键。
此函数可能很慢(O(n)),因为 QMap 的内部数据结构针对按键而不是按值进行快速查找进行了优化。
14、QMap::iterator lowerBound(const Key &key)
返回一个迭代器,该迭代器指向第一个大于或等于 key 的键值对。
QMap<int, QString> map;
map.insert(1, "one");
map.insert(5, "five");
map.insert(10, "ten");
map.lowerBound(0); // returns iterator to (1, "one")
map.lowerBound(1); // returns iterator to (1, "one")
map.lowerBound(2); // returns iterator to (5, "five")
map.lowerBound(10); // returns iterator to (10, "ten")
map.lowerBound(999); // returns end()
15、QMap::iterator upperBound(const Key &key)
返回一个迭代器,该迭代器指向第一个大于 key 的键值对。
QMap<int, QString> map;
map.insert(1, "one");
map.insert(5, "five");
map.insert(10, "ten");
map.upperBound(0); // returns iterator to (1, "one")
map.upperBound(1); // returns iterator to (5, "five")
map.upperBound(2); // returns iterator to (5, "five")
map.upperBound(10); // returns end()
map.upperBound(999); // returns end()
16、QMap::size_type remove(const Key &key)
删除所有具有 key 键的项目。如果删除之前key存在于容器中,则返回 1,否则返回 0。
17、template <typename Predicate> QMap::size_type removeIf(Predicate pred)
移除谓词 pred 为其返回 true 的所有元素。
该函数支持采用 QMap<Key, T>::iterator 类型参数或 std::pair<const Key &, T &> 类型参数的谓词。
返回删除的元素数。
QMap<int, QString> map;
map.insert(1, "one");
map.insert(5, "five");
map.insert(10, "ten");
map.removeIf([](const QMap<int, QString>::iterator it)
{
return it.key() > 8;
});
map.removeIf([](const std::pair<int, QString> pair)
{
return pair.first > 8;
});
for(auto & m : map)
{
qDebug()<<m;
}
18、T take(const Key &key)
从地图中删除具有键 key 的项目并返回与其关联的值。
如果该项目在地图中不存在,则该函数仅返回一个默认构造的值。
如果不使用返回值,remove() 效率更高。
19、T value(const Key &key, const T &defaultValue = T())
返回与键key关联的值。如果不包含带key的项目,则返回 defaultValue。
20、QList<T> values()
返回一个包含映射中所有值的列表,按其键的升序排列。
此函数以线性时间创建一个新列表。可以通过从 keyValueBegin() 迭代到 keyValueEnd() 来避免所需的时间和内存使用。
三、相关非成员
1、template <typename Key, typename T, typename Predicate> qsizetype erase_if(QMap<Key, T> &map, Predicate pred)
与 removeIf() 用法相似。
QMap<int, QString> map;
map.insert(1, "one");
map.insert(5, "five");
map.insert(10, "ten");
erase_if(map,[](const QMap<int, QString>::iterator it)
{
return it.key() > 8;
});
erase_if(map,[](const std::pair<int, QString> pair)
{
return pair.first > 8;
});
for(auto & m : map)
{
qDebug()<<m;
}