容器类:QVector、QList、QSet、QMap使用

一、介绍
std中有几个常用的容器:vector、List、set、map,Qt中也封装了类似的容器。Qt 的容器类提供了隐式数据共享、不可变的特性,并且为速度做了优化,具有较低的内存占用量等 。
二、QVector
1、添加元素

   QVector<int> intVec;
    intVec.append(10);
    intVec << 11 << 12;
    intVec.push_back(13);
    intVec.push_front(9);
    intVec.insert(2, 20);
        
   //9 10 20 11 12 13

2、遍历元素

   QVector<int>::iterator iter;
    for(iter = intVec.begin(); iter != intVec.end(); iter++)
    {
        qDebug() << *iter;//9 10 20 11 12 13
    }

3、删除元素

   intVec.remove(1);//删除第1个元素,从0开始
    intVec.remove(1, 3);//删除从第1个元素开始的3个元素
    intVec.removeFirst();//删除首元素
    intVec.removeLast();//删除最后一个元素
        intVec.removeAll(2);//删除所有与2相等的元素

4、查询元素

   intVec.contains(3);//查询vector中是否包含该值的元素

5、性能
(1)QVector插入元素insert会很慢,因为内存中移动一个位置,这会引起大量数据在内存中的移动 ,中间插入使用QList会比较快
(2)at()比operator读取速度快,因为这个不会使用深拷贝
(3)使用reserve()预先分配一定的内存大小空间,避免所需空间大于默认分配空间,造成内存多次分配

二、QList
1、添加删除元素

   QList<QString> list;
    list << "a" << "b";//左操作符进行追加元素
    list.append("c");
    list.insert(2, "we"); //在第2个元素位置插入元素
    list.push_back("dd"); //尾插法
    list.removeAt(2); //删除第2个元素

2、遍历元素

    QList<QString>::iterator iter;
    int index = 0;
    for(iter = list.begin(); iter != list.end(); iter++, index++)
    {
        qDebug() << *iter << list.at(index) << list[index];//可以使用索引或迭代器,上同
    }
//    "a" "a" "a"
//    "b" "b" "b"
//    "c" "c" "c"
//    "dd" "dd" "dd"

三、QSet
QSet类是一个模板类,他是一个哈希表集合。
QSet是Qt的一个普通容器类。QSet存储的值是不指明顺序的,QSet对这些值提供了快速检索的功能
1、操作元素

   QSet<int> setInt;
    setInt.insert(1);
    setInt.insert(2);
    setInt << 3 << 4 << 5 << 5;
    setInt.contains(2); //查询是否有3
    qDebug() << setInt.size(); //5,重复的自动去掉

2、遍历元素

QSet<int>::iterator iter;
    for(iter = setInt.begin(); iter != setInt.end(); iter++)
    {
        qDebug() << *iter;//1 4 5 2 3 
    }

四、QMap
QMap<Key, T>:提供了字典数据结构(关联数组),将类型 T 的值同类型 Key 的
键关联起来。通常,每个键与一个值关联。 QMap 以键的顺序存储数据;如果顺序无
关, QHash 提供了更好的性能,类似的,QMultiMap<Key, T>:这是 QMap 的子类,提供了多值映射
1、基本使用

    QMap<int , QString> mapInt;
    mapInt.insert(2,"aaa");
    mapInt[3] = "bbb"; //也可以这种方式插入数据
    bool isCtn = mapInt.contains(2);//是否包含该键值 isCtn = true
    QString str = mapInt[2];//根据键,取出对应的值 str = "aaa"

2、遍历容器

   QMap<int,QString>::iterator it; //遍历map
    for ( it = mapInt.begin(); it != mapInt.end(); ++it )
    {
        qDebug( "%d: %s", it.key(), it.value()); //用key() value()分别获取“键”和“值”
    }

上述遍历方式,我都只采用类std遍历方式,还有其他几种方式,如java风格的iter.hasNext,qt特有的foreach关键字进行遍历,各人的喜好不一样,可以根据自己的代码风格来选用其中一种

  • 8
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值