前言:

Qt中提供了一系列的基于模板的容器类,这些类被用来存储指定类型的元素。例如,你需要一个可变长的QString的数组,你可以使用QVector, 相对于STL容器,Qt中这些容器类都是轻量级的,更安全,更容易使用,他们都是可重入的,更优化的性能,更低的内存消耗,最小的代码膨胀。你可以通过两种方式遍历容器中的元素,一种就是Java风格的,这种方式的迭代器易于使用,提供了比较上层的功能,另外一种是STL风格,它提供了一种更轻量级,效率更高的方式,

可以同Qt和STL中的

(一)QVector

QVector,是Qt对所有数组的封装,比如我们想要一个int类型数组,我们原先会写int array[10],我们在Qt里可以写QVector   array(10)

赋值的时候,我们依然可以照旧array[5]=4;想获取某一项的值也还可以array[9],也就是说,原来的特性我们还可以用。

那么QVector有什么好处呢?

我们可以用count函数获知数组中有多少个元素,方便遍历

原先我们必须预定义好大小,而用QVector我们虽然最好也先定义好大小,但是预先不定义也可以。

我们可以使用append函数或者<

比如:

#include

...

void someFunction()

{

QVector strArray;

strArray.append("Hello");

strArray<

strArray<

//现在strArray总共有5个字符串元素,strArray.count()==5

}

...

当我们想要在某一项前面插入元素时,我们可以使用insert,比如strArray.insert(1,"我在Hello与World之间");

(二)QLinkedList

QLinkedList 基于链表实现,元素存储空间不连续,提供基于index的对元素的快速访问,有较多插入操作,删除时建议使用。 类似于QList,但是一般通过迭代器访问元素,而不是index。

QLinkedListlist;

list.append(“abc”);

list.append(“def”);

QLinkedList::iteratori = list.find(“abc”);

list.insert(I,“ghi”);

(三)QList

QList是Qt的一种泛型容器类。它以链表方式存储一组值,并能对这组数据进行快速索引,还提供了快速插入和删除等操作。

详解:

QList以链表形式存储一组元素。默认为空链表,我们可以使用<

QList list;

list << "one" <

对于非const链表,操作符[]返回的是该元素的引用,并且返回值可以用途左操作数。

if ( list[0] == "Bob" )

list[0] = "Robert";

对于只读访问,可以用at()函数实现访问,at()操作比操作符[]更快,因为它不需要深度复制。

for ( int i=0; i!=list.size(); ++i )

{

if( list.at(i) == "Jane" )

{ cout << "Found Jane atposition:" << i<< endl;}

}

QList在链表两端都预先分配了缓存,这样就使得在QList的两端插入或删除元素变得非常地快。如果需要找出某个值在链表中出现的位置,可以使用indexOf()、lastIndexOf()函数来实现。前者进行前向查找,而后者则进行反向查找。两者都会在找到匹配元素后返回该元素的索引值,没有找到匹配元素返回-1。例如:

int i = indexOf("Jane");

if ( i!=-1 )

cout << "First occurance of Jane is at position"<< i << endl;

实例解析

QList 释放内存实例详解:

1.T的类型为非指针,这时候直接调用clear()方法就可以释放了,看如下测试代码

#include

#include

#include

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

typedef struct _test

{

int id;

QString name;

QString sex;

}Por_test;

QList  slist;

for (int i=0;i<100000;i++)

{

Por_test s;

s.id = 1;

s.name = QString("hello World!");

s.sex = QString("男");

slist.append(s);

}

slist.clear();

return a.exec();

}

2.T的类型为指针的情况,这时候直接调用clear()方法将不能释放,先看代码

#include

#include

#include

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

typedef struct _test

{

int id;

QString name;

QString sex;

}Por_test;

QList  slist;

for (int i=0;i<100000;i++)

{

Por_test *s = new Por_test();

s->id = 1;

s->name = QString("hello World!");

s->sex = QString("男?");

slist.append(s);

}

qDeleteAll(slist);

slist.clear();

return a.exec();

}

说明当T的类型为指针时,调用clear()方法并不能释放其内存,此时void qDeleteAll ( const Container & c )方法将派上用场了。

我们再来看下qt助手中qDeleteAll 方法的说明

void qDeleteAll ( ForwardIterator begin,ForwardIterator end )

Deletes all the items in the range [begin,end) using the C++ delete operator. The item type must be a pointer type (forexample, QWidget *).

Example:

QList list;

list.append(newEmployee("Blackpool", "Stephen"));

list.append(new Employee("Twist","Oliver"));

qDeleteAll(list.begin(), list.end());

list.clear();

Notice that qDeleteAll() doesn't remove theitems from the container; it merely calls delete on them. In the example above,we call clear() on the container to remove the items.

This function can also be used to deleteitems stored in associative containers, such as QMap and QHash. Only theobjects stored in each container will be deleted by this function; objects usedas keys will not be deleted.

void qDeleteAll ( const Container & c )

This is an overloaded member function,provided for convenience.

This is the same as qDeleteAll(c.begin(),c.end()).

注意事项

QList中,如果T<=4的话,QList会直接将T存放在为其开辟的内存中,如果T>4的话,QList中存放指向T的指针。例如:存放penson类,包括姓名,移动电话,家庭电话等信息,QList contactList 使用指针是取不到期望的值,直接用contactList[i]就行,而且用成员函数at()返回的值是const,不能进行修改。

QList的值必须是可数的类型,这包含了我们常用的大多数类型。如果我们存储QWidget类型的话,应该使用QWidget *,而不是QWidget。

indexOf()和lastIndexOf()操作要求值的类型能进行“==”操作。

我们可以在调用其他函数之前先调用isEmpty()函数判断链表是否为空,以避免对空链表进行错误操作。而对于以索引值index为参数的成员函数,我们还需要判断该索引值是否位于有效范围内。

我们可以利用Q_ASSERT()或者Q_ASSERT_X()加上一些合理的信息来实现错误检测。

遍历qvector_QT容器类(一) 之 QVector 、QLinkedList 和 QList | 学步园相关推荐

  1. 遍历qvector_Qt容器类——1. QList类、QLinkedList类和QVector类

    在开发一个较高性能需求的应用程序时,程序员会比较关注这些容器类的运行效率,表2.1列出了QList.QLinkedList和QVector容器的时间复杂度比较. 1.QList类 QList是迄今为止 ...

  2. java 历遍 类_[Java] 遍历指定包名下所有的类(支持jar) | 学步园

    项目需要,仅做记录. 支持包名下的子包名遍历,并使用Annotation(内注)来过滤一些不必要的内部类,提高命中精度. 通过Thread.currentThread().getContextClas ...

  3. 遍历qvector_Qt 中的数据结构类(2)QList、QLinkedList、QVector、 QMap、QHash

    迭代器 QT支持两种类型的迭代器只读迭代器:const_iterator 读写迭代器:iterator 只读迭代器比读写迭代器操作速度快很多 一.QList 概念:是一个提供列表的模板类//函数: i ...

  4. list遍历_Qt 容器类之遍历器和隐式数据共享

    Qt 容器类之遍历器和隐式数据共享 前面说过,Qt 容器类提供了两种遍历器:Java 风格的和 STL 风格的.前者比较容易使用,后者则可以用在一些通过算法中,功能比较强大. 对于每一个容器类,都有与 ...

  5. 遍历qvector_顺序储存容器QVector | 学步园

    容器Containers,有时候也被称为集合collections,指的是能够在内存中存储其他特定类型的对象的对象 ,这种对象一般是通用 的模板类.C++提供了一套完整的解决方案,成为标准模板库Sta ...

  6. jtabel 遍历_Swing中经常会遇到的若干问题——JTable(持续更新) | 学步园

    (1)让组件在屏幕中央显示 public static void setContainerCenter(Container container) { Dimension screenSize = To ...

  7. python遍历文件夹下所有文件大小_python遍历文件夹读取文件大小 | 学步园

    闲来无事,写了个小程序删除内存卡中大于50m的文件 # filename  itertaorfilefolder import os import os.path filePath = raw_inp ...

  8. java map string stu_Java Map遍历的三种方式 | 学步园

    最近经常碰到Map遍历的问题,在网上查找资料后,记录下,权当备忘~~~~~~ 这里给出了三种遍历的方式,注释中已说明各自方式的优点. package edu.hrbeu.cloud.testIterM ...

  9. el表达式遍历list中的list_EL表达式获取map和list集合中的值 | 学步园

    Map的每个对象以key=value的形式给出 当forEach tag的item属性中的表达式的值是java.util.Map时,在var中命名的变量被设置为类型是java.util.Map.Ent ...

最新文章

  1. MySQL自动化平台那些事-分秒必争
  2. 谷歌和 Facebook 是如何给工程师定职级和薪水的?
  3. 共克时艰:科技助力湖北地区银行业务线上转型
  4. 【大会】除了FFmepg和WebRTC,还有哪些新工具?
  5. php 注册自动登录,php – 创建第二个自动登录用户的登录页面
  6. Leetcode--442. 数组中重复的数据
  7. 为什么需要MiniDao? 新持久层 3.5.1 版本发布,让hibernate跟mybatis一样灵活
  8. hdu 3507 Print Article(dp+斜率优化)
  9. Internet Download Manager 6.37.14 Final
  10. android 简单的闪屏页,闪屏页的实现简单原理
  11. 襄阳职业技术学院计算机技能高考,2021湖北技能高考襄阳职业技术学院怎么报名?...
  12. H-Chat:用户私聊群聊管理
  13. 开学季,中学生用什么样护眼台灯好?中学生用护眼台灯排行
  14. hdu Find Integer (6441)(大费马定理)
  15. JAVA中如何实现代码优化(技巧讲解)
  16. 熵 计算机学,计算机科学 – 熵的计算机科学定义是什么?
  17. 概论_第2章_一维均匀分布的概率公式
  18. CSS hack常用方案(摘选)
  19. 1.PWM基本概念了解
  20. 用于游戏开发和其他目的的光线投射教程

热门文章

  1. accessToken refreshToken简单使用源码demo,双token刷新及有效时间设置
  2. 微软ACE访问数据库引擎2010版_Microsoft Access 2010 数据库引擎可再发行程序包
  3. php gravatar,利用Laravel生成Gravatar头像地址的优雅方法
  4. AI遇上强迫症,大脑与情绪的羁绊有解了
  5. dos命令登录mysql
  6. HTML标签汇总(基础表单部分)
  7. 小程序(模板与配置)
  8. x264代码剖析(七):encode()函数之x264_encoder_encode()函数
  9. simulink中比scope模块还好用的平替出图工具?
  10. 深入分析星期日女孩问题:李叔叔有两个小孩,至少有一个小孩是在星期日出生的女孩,两个小孩都是女孩的概率是多少?