qt 容器

QT(3)

QMap

在Qt框架中,QMap 是一个非常有用的类,用于存储键值对(key-value pairs)。
它是一个有序的关联容器,键(keys)是唯一的,并且按照键的升序排列。
QMap 提供了高效的插入、查找和删除操作。

#include "mainwindow.h"

#include <QApplication>
#include <iostream>

using namespace std;
# if 1
// QMap
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // QMap
    QMap<QString, int> map;
    //添加元素
    map.insert("one", 1);
    map.insert("two", 2);
    map.insert("three", 3);
    qDebug()<<map;//QMap(("one", 1)("three", 3)("two", 2))
    map.remove("two");
    qDebug()<<map;//QMap(("one", 1)("three", 3))
//    map.clear();
//    qDebug()<<map;//QMap()

    //迭代器遍历
    QMapIterator<QString, int> i(map);
    while (i.hasNext()) {
        i.next();
        qDebug()<<i.key()<<" "<<i.value();
    }
    //最简单的遍历方式
    for (auto key : map.keys()) {
        qDebug()<<key<<" "<<map.value(key);
    }

    qDebug()<<"================";

    //查找元素
    qDebug()<<map.value("one");
    qDebug()<<map.key(1);

    //查找是否包含

    qDebug()<<map.contains("one");
    qDebug()<<map.contains("four");

    qDebug()<<"================";

    //输出所有key
    QList<QString> keys = map.keys();
    qDebug()<<keys;

    //输出所有value
    QList<int> values = map.values();
    qDebug()<<values;

    qDebug()<<"================";


    //一个key对应多个value
    //QMultiMap
    QMultiMap<QString, QString> multiMap;
    multiMap.insert("one","1");
    multiMap.insert("one","2");
    multiMap.insert("one","3");
    multiMap.insert("two","4");
    multiMap.insert("two","5");
    multiMap.insert("two","6");
    qDebug()<<multiMap;

    //QMultiMap遍历

    QMultiMapIterator<QString, QString> it(multiMap);
    while (it.hasNext()) {
        it.next();
        qDebug()<<it.key()<<" "<<it.value();
    }






    MainWindow w;
    w.show();
    return a.exec();
}

# endif
输出:
QMap(("one", 1)("three", 3)("two", 2))
QMap(("one", 1)("three", 3))
"one"   1
"three"   3
"one"   1
"three"   3
================
1
"one"
true
false
================
QList("one", "three")
QList(1, 3)
================
QMultiMap(("one", "3")("one", "2")("one", "1")("two", "6")("two", "5")("two", "4"))
"one"   "3"
"one"   "2"
"one"   "1"
"two"   "6"
"two"   "5"
"two"   "4"

Qhash

//todo QHash
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    QHash<QString, int> hash;
    hash.insert("one", 1);
    hash.insert("two", 2);
    hash["three"]=3;
    hash["four"]=4;

    qDebug()<<hash;
    //遍历

    for(auto key:hash.keys()){
        qDebug()<<key<<" "<<hash[key];
    }

    QHashIterator<QString, int> i(hash);
    while(i.hasNext()){
        i.next();
        qDebug()<<i.key()<<"--->"<<i.value();
    }

    //删除

    hash.remove("two");
    qDebug()<<hash;
    //检查是否为空
    qDebug()<<hash.isEmpty();
    //获取大小
    qDebug()<<hash.size();


    return a.exec();
}


输出:
QHash(("four", 4)("two", 2)("three", 3)("one", 1))
"four"   4
"two"   2
"three"   3
"one"   1
"four" ---> 4
"two" ---> 2
"three" ---> 3
"one" ---> 1
QHash(("four", 4)("three", 3)("one", 1))
false
3

Qmap 和 Qhash 的区别

QHash 和 QMap 都是 Qt 框架中用于存储键值对(key-value pairs)的类,但它们在实现和性能上有一些重要的区别:

顺序性:
QMap 是有序的关联容器,键(keys)按照升序排列。
QHash 是无序的关联容器,键(keys)没有特定的顺序。

查找速度:
QHash 提供了平均常数时间复杂度(O(1))的查找速度,这使得它在处理大量数据时比 QMap 更快。
QMap 的查找速度是对数时间复杂度(O(log n)),虽然也很高效,但在大数据集上可能不如 QHash 快。

内存使用:
QHash 通常比 QMap 使用更多的内存,因为它需要维护一个哈希表来实现快速的查找。
QMap 的内存使用相对较少,因为它使用的是平衡二叉树(通常是红黑树)。

迭代器稳定性:
QHash 在插入或删除元素时可能会使迭代器失效,尤其是在重新哈希(rehashing)时。
QMap 的迭代器在插入或删除元素时通常是稳定的,不会失效。

键的唯一性:
两者都要求键是唯一的,如果插入一个已经存在的键,新值会替换旧值。

API 接口:
QHash 和 QMap 提供了类似的 API 接口,因此在使用上可以比较方便地互相替换。

总结来说,如果你需要键值对按照键的顺序排列,或者对内存使用有严格要求,可以选择 QMap。
如果你需要快速的查找速度,尤其是处理大量数据时,可以选择 QHash。

QVector

QVector 是 Qt 框架中的一个动态数组类,类似于 C++ 标准库中的 std::vector。
它提供了高效的随机访问和动态调整大小的功能。
QVector 是一个模板类,可以存储任何类型的数据。

//todo QVector
int main(int argc, char *argv[]){
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    QVector<int> vec;
    vec<<1<<2<<3<<4;

    vec.append(5);
    vec.append(6);
    vec.append(7);
    vec.append(8);

    qDebug()<<vec;
    //元素个数
    qDebug()<<vec.count();
    //遍历

    for(int i=0;i<vec.count();i++){
        qDebug()<<vec[i];
    }

    //删除元素

    vec.remove(2);
    for(int i=0;i<vec.count();i++){
        qDebug()<<vec[i];
    }

    vec.remove(1,2);
    for(int i=0;i<vec.count();i++){
        qDebug()<<vec[i];
    }

    //判断容器是否为空
    qDebug()<<vec.isEmpty();
    //判断是否包含某个元素
    qDebug()<<vec.contains(5);
    //获取元素的索引
    qDebug()<<vec.indexOf(5);
    //获取元素的最后一个索引
    qDebug()<<vec.lastIndexOf(5);



    return a.exec();
}

QList

是 Qt 框架中的一个通用列表容器类,
用于存储任意类型的元素。
与 QVector 不同,QList 使用了分段数组的方式来存储其元素,
这使得它在内存管理和性能上有不同的特性。

#include <QList>
#include <QString>
#include <QDebug>

int main() {
    // 创建一个 QList 对象
    QList<QString> list;
    // 添加元素
    list.append("apple");
    list.append("banana");
    list.append("cherry");

    // 访问元素
    QString firstElement = list.at(0);
    qDebug() << "First element:" << firstElement;

    // 修改元素
    list[1] = "blueberry";

    // 遍历 QList
    for (int i = 0; i < list.size(); ++i) {
        qDebug() << "Element at index" << i << ":" << list.at(i);
    }
    // 遍历 QList 的另一种方式
    for (const QString& element : list) {
        qDebug() << "Element:" << element;
    }
    //迭代器遍历
    QListIterator<QString> i(list);
    while (i.hasNext()) {
        i.next();
        qDebug()<<i.value();
    }
    

    // 删除元素
    list.removeAt(2);

    // 检查是否为空
    if (list.isEmpty()) {
        qDebug() << "List is empty";
    } else {
        qDebug() << "List is not empty";
    }

    // 清空 QList
    list.clear();

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可能只会写BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值