template <typename Key, typename T> class QMap
QMap 类是一种模板类,提供基于红黑树的字典类结构。更多内容...
头文件: | #include <QMap> |
---|---|
qmake: | QT += core |
派生类: | QMultiMap |
注意: 该类中的所有函数都是可重入的。
class | const_iterator |
---|---|
class | iterator |
class | key_iterator |
typedef | ConstIterator |
typedef | Iterator |
typedef | const_key_value_iterator |
typedef | difference_type |
typedef | key_type |
typedef | key_value_iterator |
typedef | mapped_type |
typedef | size_type |
QMap(const typename std::map<Key, T> &other) | |
---|---|
QMap(QMap<Key, T> &&other) | |
QMap(const QMap<Key, T> &other) | |
QMap(std::initializer_list<std::pair<Key, T> > list) | |
QMap() | |
QMap<Key, T> & | operator=(QMap<Key, T> &&other) |
QMap<Key, T> & | operator=(const QMap<Key, T> &other) |
~QMap() | |
QMap::iterator | begin() |
QMap::const_iterator | begin() const |
QMap::const_iterator | cbegin() const |
QMap::const_iterator | cend() const |
void | clear() |
QMap::const_iterator | constBegin() const |
QMap::const_iterator | constEnd() const |
QMap::const_iterator | constFind(const Key &key) const |
QMap::const_key_value_iterator | constKeyValueBegin() const |
QMap::const_key_value_iterator | constKeyValueEnd() const |
bool | contains(const Key &key) const |
int | count(const Key &key) const |
int | count() const |
bool | empty() const |
QMap::iterator | end() |
QMap::const_iterator | end() const |
QPair<QMap::iterator, QMap::iterator> | equal_range(const Key &key) |
QPair<QMap::const_iterator, QMap::const_iterator> | equal_range(const Key &key) const |
QMap::iterator | erase(QMap::iterator pos) |
QMap::iterator | find(const Key &key) |
QMap::const_iterator | find(const Key &key) const |
T & | first() |
const T & | first() const |
const Key & | firstKey() const |
QMap::iterator | insert(const Key &key, const T &value) |
QMap::iterator | insert(QMap::const_iterator pos, const Key &key, const T &value) |
void | insert(const QMap<Key, T> &map) |
bool | isEmpty() const |
const Key | key(const T &value, const Key &defaultKey = Key()) const |
QMap::key_iterator | keyBegin() const |
QMap::key_iterator | keyEnd() const |
QMap::key_value_iterator | keyValueBegin() |
QMap::const_key_value_iterator | keyValueBegin() const |
QMap::key_value_iterator | keyValueEnd() |
QMap::const_key_value_iterator | keyValueEnd() const |
QList | keys() const |
QList | keys(const T &value) const |
T & | last() |
const T & | last() const |
const Key & | lastKey() const |
QMap::iterator | lowerBound(const Key &key) |
QMap::const_iterator | lowerBound(const Key &key) const |
int | remove(const Key &key) |
int | size() const |
void | swap(QMap<Key, T> &other) |
T | take(const Key &key) |
std::map<Key, T> | toStdMap() const |
QMap::iterator | upperBound(const Key &key) |
QMap::const_iterator | upperBound(const Key &key) const |
const T | value(const Key &key, const T &defaultValue = T()) const |
QList | values() const |
bool | operator!=(const QMap<Key, T> &other) const |
bool | operator==(const QMap<Key, T> &other) const |
T & | operator[](const Key &key) |
const T | operator[](const Key &key) const |
QDataStream & | operator<<(QDataStream &out, const QMap<Key, T> &map) |
---|---|
QDataStream & | operator>>(QDataStream &in, QMap<Key, T> &map) |
QMap<Key, T> 是一种 Qt 泛型容器类。该类存储键值对,可以用相关联的键快速查找值。
QMap 的功能与 QHash 非常相似。二者的区别在于:
下面是一个键类型为 QString,值类型为 int
的 QMap 的示例:
QMap<QString, int> map;
可以使用 operator[]() 运算符将键值对插入到 map 中:
map["one"] = 1;
map["three"] = 3;
map["seven"] = 7;
上面的代码将3个键值对插入到 QMap 中:("one", 1),("three", 3) 和 ("seven", 7)。另外一种向 map 中插入元素的方法是使用 insert():
map.insert("twelve", 12);
使用 operator[]() 运算符或 value() 查找值:
int num1 = map["thirteen"];
int num2 = map.value("thirteen");
如果 map 中不存在指定的键,这些函数返回默认构造的值。
如果想检查 map 中是否包含特定键,使用 contains():
int timeout = 30;
if (map.contains("TIMEOUT"))
timeout = map.value("TIMEOUT");
还有一个 value() 的重载函数,如果 map 中不存在指定键的元素,该函数使用第2个参数作为默认值:
int timeout = map.value("TIMEOUT", 30);
一般推荐使用 contains() 和 value() 而不是 operator[]() 运算符查找 map 中的键。原因是如果 map 中不存在相同键的元素,operator[]() 运算符会默默地将一个元素插入到 map 中(除非 map 是 const 的)。例如,下面的代码片段将在内存中创建1000个元素:
// 错误
QMap<int, QWidget *> map;
...
for (int i = 0; i < 1000; ++i) {
if (map[i] == okButton)
cout << "Found button at index " << i << Qt::endl;
}
为了避免这个问题,将上面代码中的 map[i]
替换为 map.value(i)
。
如果想遍历 QMap 中存储的所有键值对,可以使用迭代器。QMap 同时提供 Java 风格迭代器(QMapIterator 和 QMutableMapIterator)和 STL 风格迭代器(QMap::const_iterator 和 QMap::iterator)。下面是使用 Java 风格迭代器遍历 QMap<QString, int> 的方法:
QMapIterator<QString, int> i(map);
while (i.hasNext()) {
i.next();
cout << i.key() << ": " << i.value() << Qt::endl;
}
下面是相同的代码,不过这次使用 STL 风格迭代器:
QMap<QString, int>::const_iterator i = map.constBegin();
while (i != map.constEnd()) {
cout << i.key() << ": " << i.value() << Qt::endl;
++i;
}
上面的代码按照键的升序遍历各元素。
通常,QMap 每个键只允许有一个值。如果用已经存在的键调用 insert(),先前的值将被删除。例如:
map.insert("plenty", 100);
map.insert("plenty", 2000);
// map.value("plenty") == 2000
然而,可以使用派生类 QMultiMap 在一个键中存储多个值。使用 values(const Key &key) 取得单个键关联的所有值,该函数返回一个 QList<T>:
QList<int> values = map.values("plenty");
for (int i = 0; i < values.size(); ++i)
cout << values.at(i) << Qt::endl;
共享同一键的多个元素按照从最新到最早插入的顺序返回。另外一种方法是调用 find() 取得 STL 风格迭代器,该迭代器指向共享同一键的多个元素中的第一个元素,然后从该元素开始遍历:
QMap<QString, int>::iterator i = map.find("plenty");
while (i != map.end() && i.key() == "plenty") {
cout << i.value() << Qt::endl;
++i;
}
如果只想从 map 中获取值(而不是键),也可以使用 foreach:
QMap<QString, int> map;
...
foreach (int value, map)
cout << value << Qt::endl;
移除元素有几种方法。一种是调用 remove();该函数移除指定键的所有元素。另一种方法是使用 QMutableMapIterator::remove()。另外,还可以使用 clear() 清除整个 map。
QMap 键和值的数据类型必须是可赋值数据类型。这涵盖了大多数可能会遇到的数据类型,但是编译器不会存储 QWidget 这样的对象作为值,应该存储 QWidget *。另外,QMap 的键类型必须提供 operator<() 运算符。QMap 用它来保持元素有序,并假定两个键 x
和 y
在 x < y
和 y < x
都不为 true 的情况下相等。
例子:
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
class Employee
{
public:
Employee() {}
Employee(const QString &name, QDate dateOfBirth);
...
private:
QString myName;
QDate myDateOfBirth;
};
inline bool operator<(const Employee &e1, const Employee &e2)
{
if (e1.name() != e2.name())
return e1.name() < e2.name();
return e1.dateOfBirth() < e2.dateOfBirth();
}
#endif // EMPLOYEE_H
该例中,先比较雇员名。如果雇员名相等,再比较二者的生日来分出大小。
另请参阅 QMapIterator,QMutableMapIterator,QHash 和 QSet.
QMap<Key, T>::const_iterator 的 Qt 风格的别名。
QMap<Key, T>::iterator 的 Qt 风格的别名。
QMap::const_key_value_iterator 类型定义为 QMap 和 QMultiMap 提供 STL 风格迭代器。
除了 operator *() 运算符返回的是键值对而不是值之外,QMap::const_key_value_iterator 基本和 QMap::const_iterator 相同。
Qt 5.10 中引入该类型定义。
另请参阅 QKeyValueIterator。
ptrdiff_t 的类型别名。为兼容 STL 提供。
Key 的类型别名。为兼容 STL 提供。
QMap::key_value_iterator 类型定义为 QMap 和 QMultiMap 提供 STL 风格迭代器。
除了 operator *() 运算符返回的是键值对而不是值之外,QMap::key_value_iterator 基本和 QMap::iterator 相同。
Qt 5.10 中引入该类型定义。
另请参阅 QKeyValueIterator。
T 的类型别名。为兼容 STL 提供。
int 的类型别名。为兼容 STL 提供。
构造一个 other 的副本。
另请参阅 toStdMap()。
移动构造一个 QMap 实例,使该实例指向 other 所指向的同一对象。
Qt 5.2 中引入该函数。
构造一个 other 的副本。
该操作需要常数时间,因为 QMap 是隐式共享的。这使得从一个函数返回 QMap 非常快。如果共享实例被修改了,它将以线性时间被复制一份(写时拷贝)。
另请参阅 operator=()。
用初始化列表 list 中每个元素的副本构造一个 map。
只有当程序在 C++11 模式下编译时,该函数才可用。
Qt 5.1 中引入该函数。
构造一个空 map。
另请参阅 clear()。
移动赋值 other 到该 QMap 实例。
Qt 5.2 中引入该函数。
将 other 赋值给该 map 并返回该 map 的引用。
析构 map。该 map 中值的引用及所有该 map 的迭代器都将失效。
返回 STL 风格迭代器,指向 map 中的第一个元素。
另请参阅 constBegin() 和 end()。
这是一个重载函数。
返回常量类型的 STL 风格迭代器,指向 map 中的第一个元素。
Qt 5.0 中引入该函数。
返回常量类型的 STL 风格迭代器,指向 map 中最后一个元素之后的假想元素。
Qt 5.0 中引入该函数。
从 map 中移除所有元素。
另请参阅 remove()。
返回常量类型的 STL 风格迭代器,指向 map 中的第一个元素。
返回常量类型的 STL 风格迭代器,指向 map 中最后一个元素之后的假想元素。
另请参阅 constBegin() 和 end()。
返回常量类型的迭代器,指向 map 中键为 key 的元素。
如果 map 不包含键为 key 的元素,该函数返回 constEnd()。
Qt 4.1 中引入该函数。
另请参阅 find() 和 QMultiMap::constFind()。
返回常量类型的 STL 风格迭代器,指向 map 中的第一项.
Qt 5.10 中引入该函数。
另请参阅 keyValueBegin()。
返回常量类型的 STL 风格迭代器,指向 map 中最后一项之后的假想项。
Qt 5.10 中引入该函数。
另请参阅 constKeyValueBegin()。
如果该 map 包含键为 key 的元素,返回 true
;否则返回 false
。
另请参阅 count() 和 QMultiMap::contains()。
返回与键 key 相关联的元素个数。
另请参阅 contains() 和 QMultiMap::count()。
这是一个重载函数。
同 size().
该函数为兼容 STL 提供。与 isEmpty() 等价,如果 map 为空,返回 true
;否则返回 false
。
返回 STL 风格迭代器,指向 map 中最后一个元素之后的假想元素。
这是一个重载函数。
返回一对迭代器界定与 key 相关联的值的范围 [first, second)
。
这是一个重载函数。
Qt 5.6 中引入该函数。
从 map 中移除迭代器 pos 指向的键值对,返回指向 map 中下一个元素的迭代器。
另请参阅 remove()。
返回迭代器,指向 map 中键为 key 的元素。
如果 map 不包含键为 key 的元素,函数返回 end()。
如果 map 包含多个键为 key 的元素,函数返回指向最新插入的那个值的迭代器。其它值可以通过递增迭代器取得。例如,下面的代码遍历同一键的所有元素:
QMap<QString, int> map;
...
QMap<QString, int>::const_iterator i = map.find("HDR");
while (i != map.end() && i.key() == "HDR") {
cout << i.value() << Qt::endl;
++i;
}
另请参阅 constFind(),value(),values(),lowerBound(),upperBound() 和 QMultiMap::find()。
这是一个重载函数。
返回指向 map 中第一个值的引用,即映射到最小键的值。该函数假定 map 不为空。
对于非共享 map(或者调用的是常量版本),该函数在常数时间内完成。
Qt 5.2 中引入该函数。
另请参阅 last(),firstKey() 和 isEmpty()。
这是一个重载函数。
Qt 5.2 中引入该函数。
返回 map 中最小键的引用。该函数假定 map 不为空。
该操作在常数时间内完成。
Qt 5.2 中引入该函数。
另请参阅 lastKey(),first(),keyBegin() 和 isEmpty()。
用键 key 和值 value 插入一个新元素。
如果已经存在键为 key 的元素,该元素的值将被 value 替换。
如果有多个键为 key 的元素,最新插入的元素的值将被 value 替换。
另请参阅 QMultiMap::insert()。
这是一个重载函数。
用键 key 和值 value 插入一个新元素,pos 用来提示插入位置。
如果以 constBegin() 作为插入位置提示,表明 key 比 map 中的任何键都小,而 constEnd() 则建议 key(严格)大于 map 中的任何键。否则提示应该满足条件 (pos - 1).key() < key <= pos.key()。如果提示 pos 是错误的,其将被忽略,并以常规方式插入。
如果已经存在键为 key 的元素,该元素的值将被 value 替换。
如果有多个键为 key 的元素,只会有一个元素的值被 value 替换。
如果提示是正确的,并且 map 未被共享,插入操作平均在常数时间内完成。
从有序数据创建 map 时,从最大键的元素开始以 constBegin() 作为提示插入,比按从小到大的顺序以 constEnd() 作为提示插入更快,因为 constEnd() - 1 (用来检查提示是否合法)需要对数时间。
注意: 需小心对待提示。提供从旧的共享实例取得的迭代器可能引起崩溃,还会有默默污染 map 和 pos 的 map 的风险。
Qt 5.1 中引入该函数。
另请参阅 QMultiMap::insert()。
将 map 中的所有元素插入到本 map 中。
如果一个键同时在两个 map 中出现,其值将被传入的 map 中存储的值替换。
注意: 如果传入的 map 中同一键关联多个元素,则该键的最终值未定义。
Qt 5.15 中引入该函数。
另请参阅 QMultiMap::insert()。
如果 map 中不包含元素,返回 true
;否则返回 false
。
另请参阅 size()。
这是一个重载函数。
返回与值 value 对应的第一个键,如果 map 不包含值为 value 的元素,返回 defaultKey。如果没有提供 defaultKey,函数返回默认构造的键。
该函数可能会比较慢(线性时间),因为 QMap 的内部数据结构是以快速查找键而不是值为目标来优化的。
Qt 4.3 中引入该函数。
返回常量类型的 STL 风格迭代器,指向 map 中的第一个键。
Qt 5.6 中引入该函数。
返回常量类型的 STL 风格迭代器,指向 map 中的最后一个元素之后的假想元素的键。
Qt 5.6 中引入该函数。
返回 STL 风格迭代器,指向 map 中的第一项。
Qt 5.10 中引入该函数。
另请参阅 keyValueEnd().
返回常量类型的 STL 风格迭代器,指向 map 中的第一项。
Qt 5.10 中引入该函数。
另请参阅 keyValueEnd()。
返回 STL 风格迭代器,指向 map 中最后一项之后的假想项。
Qt 5.10 中引入该函数。
另请参阅 keyValueBegin()。
返回常量类型的 STL 风格迭代器,指向 map 中最后一项之后的假想项。
Qt 5.10 中引入该函数。
另请参阅 keyValueBegin()。
以升序返回 map 中所有键的列表。在 map 中多次出现的键(当该方法应用在 QMultiMap 时)也会在列表中多次出现。
键的顺序将确保与通过 values() 返回的值的顺序相同。
另请参阅 QMultiMap::uniqueKeys(),values() 和 key()。
这是一个重载函数。
以升序返回所有与值 value 相关联的键的列表。
该函数可能会比较慢(线性时间),因为 QMap 的内部数据结构是以快速查找键而不是值为目标来优化的。
返回 map 中最后一个值的引用,即映射到最大键的值。该函数假定 map 不为空。
对于非共享 map(或者调用的是常量版本),该函数在对数时间内完成。
Qt 5.2 中引入该函数。
另请参阅 first(),lastKey() 和 isEmpty()。
这是一个重载函数。
Qt 5.2 中引入该函数。
返回 map 中最大键的引用。该函数假定 map 不为空。
该函数在对数时间内完成。
Qt 5.2 中引入该函数。
另请参阅 firstKey(),last(),keyEnd() 和 isEmpty()。
返回指向 map 中键 key 所关联的第一个元素的迭代器。如果 map 不包含键为 key 的元素,函数返回指向距离下一个键最近的元素的迭代器。
例子:
QMap<int, QString> map;
map.insert(1, "one");
map.insert(5, "five");
map.insert(10, "ten");
map.lowerBound(0); // 返回指向 (1, "one") 的迭代器
map.lowerBound(1); // 返回指向 (1, "one") 的迭代器
map.lowerBound(2); // 返回指向 (5, "five") 的迭代器
map.lowerBound(10); // 返回指向 (10, "ten") 的迭代器
map.lowerBound(999); // 返回 end()
如果 map 包含多个键为 key 的元素,该函数返回指向最新插入的值的迭代器。其它值可以通过递增迭代器访问。例如,下面的例子遍历同一键所关联的所有元素:
QMap<QString, int> map;
...
QMap<QString, int>::const_iterator i = map.lowerBound("HDR");
QMap<QString, int>::const_iterator upperBound = map.upperBound("HDR");
while (i != upperBound) {
cout << i.value() << Qt::endl;
++i;
}
另请参阅 upperBound() 和 find()。
这是一个重载函数。
从 map 中移除所有键为 key 的元素。返回被移除的元素个数,如果键存在,则为1,否则为0。
另请参阅 clear(),take() 和 QMultiMap::remove()。
返回 map 中键值对的个数。
将 map other 与本 map 交换。该操作非常快,永远不失败。
Qt 4.8 中引入该函数。
从 map 中移除键为 key 的元素,返回键 key 所关联的值。
如果 map 中不存在该元素,该函数简单返回一个默认构造的值。如果 map 中有多个键为 key 的元素,只移除最新插入的元素并返回值。
如果不使用返回值,使用 remove() 更高效一些。
另请参阅 remove()。
返回与这个 QMap 相对应的 STL map。
返回迭代器,指向 map 中首个大于键 key 的元素。如果 map 不包含键为 key 的元素,该函数返回指向距离下一个键最近的元素的迭代器。
例子:
QMap<int, QString> map;
map.insert(1, "one");
map.insert(5, "five");
map.insert(10, "ten");
map.upperBound(0); // 返回指向 (1, "one") 的迭代器
map.upperBound(1); // 返回指向 (5, "five") 的迭代器
map.upperBound(2); // 返回指向 (5, "five") 的迭代器
map.upperBound(10); // 返回 end()
map.upperBound(999); // 返回 end()
另请参阅 lowerBound() 和 find()。
这是一个重载函数。
返回键 key 关联的值。
如果 map 不包含键为 key 的元素,该函数返回 defaultValue。 如果没有指定 defaultValue,该函数返回默认构造的值。如果 map 中有多个键为 key 的元素,返回最新插入的元素的值。
另请参阅 key(),values(),contains() 和 operator[]()。
按照键升序返回 map 中所有值的列表。如果一个键关联到多个值,该键的所有值都将被放入列表中,而不只是最新插入的值。
如果 other 与本 map 不相等,返回 true
,否则返回 false
。
如果两个 map 包含相同的键值对,则认为二者相等。
该函数需要值类型实现 operator==()
。
另请参阅 operator==()。
如果 other 与本 map 相等,返回 true
,否则返回 false
。
如果两个 map 包含相同的键值对,则认为二者相等。
该函数需要值类型实现 operator==()
。
另请参阅 operator!=()。
返回键 key 所关联的值的可修改引用。
如果 map 不包含键为 key 的元素,该函数用键 key 插入一个默认构造的值,并返回该值的引用。如果 map 包含多个键为 key 的元素,该函数返回最新插入的那个值的引用。
这是一个重载函数。
同 value()。
将 map 写出到流 out。
该函数需要键和值类型实现 operator<<()
。
另请参阅 QDataStream 运算符的格式。
从流 in 读入数据到 map。
该函数需要键和值类型实现 operator>>()
。
另请参阅 QDataStream 运算符的格式。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。