一、qmultimap简介
qmultimap是Qt中的一个关联容器,它是一个键类型到值类型的映射,允许存储相同键的多个值。它是通过红黑树实现的,所以访问、删除、查找等操作均具有O(log n)的效率。
二、qmultimap的用途
qmultimap的用法与qmap类似,但它允许一个键关联多个值,适用于需要对键值进行分组的情况。例如,假设您需要将人名按照性别分组,可以使用qmultimap存储多个同性别的人名,键为性别,值为人名。
三、qmultimap的创建和插入元素
创建空的qmultimap对象很简单,只需要声明一个qmultimap类型的变量即可:
qmultimap<QString, int> myMap;
这个例子创建了一个qmultimap对象,它的键类型为QString,值类型为int。
插入元素可以使用insert()函数实现,需要传递一个QPair对象作为参数,其中第一个元素表示键,第二个元素表示值:
myMap.insert(qMakePair("apple", 2)); myMap.insert(qMakePair("orange", 3)); myMap.insert(qMakePair("apple", 5)); myMap.insert(qMakePair("banana", 1));
这个例子往qmultimap中插入了四个元素,其中有两个元素的键为”apple”,即”apple”关联了两个值2和5。
四、qmultimap的访问元素
可以使用value()函数访问qmultimap中的元素,需要传递一个键作为参数,如果该键在qmultimap中关联了多个值,则value()函数返回最先插入的那个值:
int value = myMap.value("apple"); // 返回2
如果你需要访问”apple”关联的所有值,可以使用values()函数:
QList<int> values = myMap.values("apple"); // 返回{2, 5}
还可以使用constIterator()、begin()和end()函数遍历qmultimap中的元素:
for(QMultiMap<QString, int>::const_iterator iter = myMap.constBegin(); iter != myMap.constEnd(); ++iter) { QString key = iter.key(); int value = iter.value(); qDebug() << key << value; }
这个例子遍历了整个qmultimap,输出每个元素的键和值。
五、qmultimap的删除元素
可以使用remove()函数删除qmultimap中的元素,需要传递一个键和值作为参数,如果这个键关联了多个值,则只删除最先插入的那个值:
myMap.remove("apple", 2);
这个例子删除了键为”apple”,值为2的元素。
如果你需要删除该键关联的所有值,可以使用remove()函数,只需要传递一个键作为参数:
myMap.remove("apple");
这个例子删除了键为”apple”,全部值的元素。
六、qmultimap的其他操作
qmultimap还提供了其他一些常用操作,例如count()函数可以返回一个键在qmultimap中关联的值的个数,isEmpty()函数可以判断qmultimap是否为空。
七、完整代码示例
#include <QDebug> #include <QMultiMap> int main() { // 创建一个qmultimap对象 QMultiMap<QString, int> myMap; // 插入元素 myMap.insert(qMakePair("apple", 2)); myMap.insert(qMakePair("orange", 3)); myMap.insert(qMakePair("apple", 5)); myMap.insert(qMakePair("banana", 1)); // 访问元素 int value = myMap.value("apple"); // 返回2 qDebug() << value; QList<int> values = myMap.values("apple"); // 返回{2, 5} qDebug() << values; for(QMultiMap<QString, int>::const_iterator iter = myMap.constBegin(); iter != myMap.constEnd(); ++iter) { QString key = iter.key(); int value = iter.value(); qDebug() << key << value; } // 删除元素 myMap.remove("apple", 2); myMap.remove("apple"); return 0; }