一、qmultimap简介
qmultimap是Qt中的一个关联容器,它是一个键类型到值类型的映射,允许存储相同键的多个值。它是通过红黑树实现的,所以访问、删除、查找等操作均具有O(log n)的效率。
二、qmultimap的用途
qmultimap的用法与qmap类似,但它允许一个键关联多个值,适用于需要对键值进行分组的情况。例如,假设您需要将人名按照性别分组,可以使用qmultimap存储多个同性别的人名,键为性别,值为人名。
三、qmultimap的创建和插入元素
创建空的qmultimap对象很简单,只需要声明一个qmultimap类型的变量即可:
qmultimap 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 values = myMap.values("apple"); // 返回{2, 5}
还可以使用constIterator()、begin()和end()函数遍历qmultimap中的元素:
for(QMultiMap::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
#include
int main()
{
// 创建一个qmultimap对象
QMultiMap 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 values = myMap.values("apple"); // 返回{2, 5}
qDebug() << values;
for(QMultiMap::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;
}