qt 容器QVector,QMap,QHash的常见使用与该迭代器的简单介绍

发布时间:2023年12月17日

一.

QVector容器是一个动态数组,可以容纳任意数量的元素,在相邻的内存中存储给定的数据类型作为一组数据,在QVector前部或中间位置插入元素都会导致内存中大量的数据元素移动,这使得操作速度会减慢.可使用迭代器对这组数据进行访问.

和其他的容器类型类似,QVector容器的功能也有添加元素append(),删除元素remove(),修改元素replace(),查询contains(),访问.......

    vStarts<<"鹿晗"<<"热巴";        //添加(尾部插入)
    vStarts.append("杨紫");        //头部插入
    vStarts.prepend("Anglebaby");  //尾部插入
    vStarts.insert(2,"小明");      //指定位置插入

    vStarts.replace(2,"迪丽热巴");//替换

    //删除元素下标为0的元素
    vStarts.remove(0);

    //删除某个元素
    vStarts.removeAll("鹿晗");    //移除所有比较结果相同的元素
    vStarts.removeAt(0);          //移除指定位置的元素
    vStarts.removeOne("杨紫");    //移除比较结果相同的第一个元素
    vStarts.clear();删除所有元素

    qDebug()<<"是否有小明?:"<<vStarts.contains("小明");//查询是否有该元素

使用迭代器访问数据.

1.

java风格迭代器

    //java风格只读迭代
    QVectorIterator<QString> it_sr(vStarts);
    for(it_sr.toFront();it_sr.hasNext();){
        qDebug() << it_sr.next();
    }


    //java风格读写迭代
    QMutableVectorIterator<QString> it_srw(vStarts);
    for(it_srw.toFront();it_srw.hasNext();){

        QString s = it_srw.next();
        //方式1.使用QString类型的compare()方法比较字符串.比较结果相同则返回0(假).
        if(!QString::compare(s,"热巴")){    
            it_srw.setValue("赵丽颖");
        }

        //方式2.
        //if(s == "热巴"){
        //    it_srw.setValue("赵丽颖");
        //}
    }


2.

STL风格迭代器.

    //STL读写迭代器
    QVector<QString>::iterator it_VWR;
    it_VWR = vStarts.begin();
    for(;it_VWR != vStarts.end();++it_VWR){
        *it_VWR = *it_VWR + "好人";
        qDebug()<<*it_VWR;
    }


    //STL只读迭代器
    QVector<QString>::const_iterator it_VR;
    it_VR = vStarts.constBegin();
    for(;it_VR != vStarts.constEnd();++it_VR){
        qDebug()<<*it_VR;
    }

二.

容器QMap类型由键(key)值(value)对组成一个元素.通过键key映射到值value.

第一个QString数据类型值是键key,第二个QString数据类型值是值value.一个键对应一个值,以key字母顺序(A~Z)存储数据.

    //一个键对应一个值
    QMap<QString,QString> infoMap;
    
    //添加元素
    infoMap.insert("王祖蓝","163cm");   //方式1
    infoMap["姚明"] = "226cm";          //方式2
    infoMap.insertMulti("易烊千玺","173cm");   //方式3.如果映射中已经存在具有相同键的项,则该函数将简单地创建一个新项

    

通过key找value

    qDebug() <<"姚明:" <<infoMap["姚明"];               //226cm
    qDebug() <<"易烊千玺:" <<infoMap.value("易烊千玺");  //173cm

通过value找key

qDebug()<<"173cm的是谁呢?"<<infoMap.key("173cm"); //易烊千玺

1.

java风格迭代器

与QVector容器迭代器非常类似,打印时要把迭代器位置指向下一个位置.同时打印键值对只能分别把键key和值value写出来,不能把俩个键值对当做一个整体来打印输出.

    //java风格只读迭代器
    QMapIterator<QString,QString> it_r(infoMap);
    for(it_r.toFront();it_r.hasNext();){
        
        //方式1
        //it_r.next();
        //qDebug()<<it_r.key() <<":"<<it_r.value();//以key的字母A~Z作为排序的依据.有序存储.
    
        //方式2
        qDebug()<<it_r.next().key() <<":"<<it_r.value();
    }    

    //java风格读写迭代器
    QMutableMapIterator<QString,QString> it_rw(infoMap);
    if(it_rw.findNext("163cm")){    //查找元素
        it_rw.setValue("163.1cm");  //重新设置元素值value
    }

    for(it_rw.toFront();it_rw.hasNext();){
        it_rw.next();//获取元素
        qDebug()<<it_rw.key()<<":"<<it_rw.value();
    }

2.

STL风格迭代器

    //STL风格读写迭代器
    QMap<QString,QString>::iterator it_QWR;
    it_QWR = wMap1.begin();
    for(;it_QWR != wMap1.end();++it_QWR){
        qDebug()<<it_QWR.key()<<it_QWR.value() + "-STL";
    }
    
    //STL风格只读迭代器
    QMap<QString,QString>::const_iterator it_QR;
    it_QR = wMap1.constBegin();
    for(;it_QR != wMap1.constEnd();++it_QR){
        qDebug()<<it_QR.key()<<it_QR.value() + "-stl";
    }

3.

前面讲的是一个键对应一个值的情况,下面是一个键对应多个值的情况.

    //一个键对应对多个值
    QMultiMap<QString,QString> wMap1;

    wMap1.insert("spring","15°C");

    wMap1.insert("summer","35°C");//一个键key插入多个值value
    wMap1.insert("summer","39°C");
    wMap1.insert("summer","40°C");

    wMap1.insert("autumn","23°C");

    wMap1.insert("winter","-5°C");
    wMap1.insert("winter","-15°C");
    wMap1.insert("winter","-55°C");

    wMap1.remove("winter","-55°C"); //删除元素


    //打印一个键的多个值(键值对).所有winter键key的键值对都会被打印出来
    qDebug()<<endl<<"winter:"<<wMap1.values("winter");

通过value()函数,参数填写键值key,就能打印所有相同键的值value.即一个键key的对应的多个值value.使用迭代器访问的方式与上面一样.

三.

QHash容器与QMap容器一样,也是使用键值对的方式存储数据,它实现了一个哈希表,通过哈希函数将键映射到值,数据存放无序,任意顺序存储,所以它的存储速度比QMap更快.

    //QHash类,数据存放无序
    QHash<int,QString> moneyHash;

    moneyHash.insert(1,"一块钱");
    moneyHash.insert(10,"十块钱");
    moneyHash.insert(20,"二十块钱");   //方式1
    moneyHash[50] = "五十块钱";        //方式2
    moneyHash[100] = "一百块钱";
    moneyHash.insertMulti(100,"毛爷爷"); //一个键有多个值使用函数insertMulti()插入

    //该方式让前面key为100的value"一百块钱"会被"毛爷爷"覆盖,insertMulti():一个键多个值会被保存
    //moneyHash[100] = "毛爷爷";  

需要注意的是,如果一个键映射多个值,使用方式2并不能添加一个新的键值对,它只会在同一个键的键值对上,把前面相同键的值覆盖掉.所以使用insertMulti()函数才会添加新的键值对,而不会覆盖原有的键值对.

1.

java风格迭代器

迭代器的使用方式和上面的一样,这里就不一一列举了.

    //java风格只读迭代器
    QHashIterator<int,QString> it_mr(moneyHash);

    //java风格读写迭代器
    QMutableHashIterator<int,QString> it_mrw(moneyHash);

2.

STL风格迭代器

由于迭代器的访问方式和前面的QMap类似,就不一一详细说明.

    //STL读写迭代器    
    QHash<int,QString>::iterator it_SWR;   
     
    //STL只读迭代器
    QHash<int,QString>::const_iterator it_SR;

all~~

文章来源:https://blog.csdn.net/qq_55359819/article/details/134915704
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。