Qt中的qmultimap详解(QMultiMap)

一、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;
}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注