遍历qvector_转:Qt 之 QVector

遍历qvector_转:Qt 之 QVectorQVector 类是一个提供动态数组的模板类 QVector 是 Qt 普通容器类的一种 它将自己的每一个对象存储在连续的内存中 可以使用索引号来快速访问它们 QList QLinkedList 和 QVarLengthAr 也提供了相似的功能 它们使用方法如下 lQList 一般用得最多 它能满足我们绝大部分需求 像 prepend 和 insert 这样的操作通常比 QVector 要快些 这是由于 QL

QVector类是一个提供动态数组的模板类。

QVector是Qt普通容器类的一种。它将自己的每一个对象存储在连续的内存中,可以使用索引号来快速访问它们。QList、QLinkedList和 QVarLengthArray也提供了相似的功能,它们使用方法如下:

l QList一般用得最多,它能满足我们绝大部分需求。像prepend()和insert()这样的操作通常比QVector要快些,这是由于QList存储它的对象的方式(Algorithmic Complexity)不同。还有它基于索引的API比QLinkedList的基于迭代器的API更方便使用。最后,执行程序时它的代码扩展量更少些。

l QLinkedList,当你需要使用一个真正的链表,要求在恒定的时间内将对象插入到列表的中间,你更想用迭代器而不是索引号来访问对象,这个时候就使用QLinkedList吧!

l QVector,如果你想要在连续的内存上存储你的对象,你的对象比指针还要大,你想避免单独地把对象插入到堆的头部时,使用QVector。

l QVarLengthArray,如果你想要一个低层次的可变大小的容器,QVarLengthArray就足够了,它的优点是速度快!

下面是使用QVector存放整型值和QString的例子:

1

QVector integerVector;

2

QVector stringVector;

QVector保存对象的向量容器,通常是使用初始大小来创建向量容器。举例,下面的代码构造了一个拥有200个元素的QVector:

QVector vector(200);

1

如果所创建的向量容器对象没有赋初值,就会被使用这个向量容器的类的默认构造函数进行初始化。基本类型和指针类型都会被初始化为0,如果想使用其它的初值来初始化对象时,可以在初始化时再添加一个参数:

QVector vector(200,”Pass”);

1

你也可以调用fill()函数在任何时候填充向量容器。 就像C++的数组一样,QVector的索引号也是从0开始的。使用索引号来访问对象时,可以这样operator

if (vector[0] == “Liz”)

vector[0] =”Elizabeth”;

1

2

如果只是读取向量容器的对象,可以调用at()函数来访问对象:

for (int i = 0; i < vector.size(); ++i)

{

if (vector.at(i) ==”Alfonso”)

cout << "FoundAlfonso at position " << i << endl;

}

1

2

3

4

5

调用at()函数来读取对象会比使用operator读取速度更快,因为这不会使用深度复制(deep copy)。

调用data()函数也可以访问保存在QVector的数据。这个函数会返回指向向量容器的第一个对象的指针。这样,你就可以使用指针来访问和修改向量容器内的对象。你可以使用指针将一个QVector向量容器传递给接收普通C++数组的函数。

你可以使用indexOf()和lastIndexOf()来查找某个对象出现的次数。前者从给定的位置向前搜索,后者是向后搜索。如果查找到了它们就返回相应的索引号,否则就返回-1,举例:

int i = vector.indexOf(“Harumi”);

if (i != -1)

cout << "Firstoccurrence of Harumi is at position " << i << endl;

1

2

3

contains()函数是用来查找向量容器内是否含有某个对象。

count()函数可以找出某个对象出现的次数。

insert(), replace(), remove(), prepend(), append()可以用来添加,移动和删除某个对象。对于体积较大的向量容器,除了append()和replace()这两个函数外,其它函数会比较慢,因为在内存中移动一个位置时,这些函数会使向量容器内的对象要移动许多次!如果你想要一个能够在中部快速插入和删除的容器时,可以使用QList或者QLinkedList。

resize()函数可以在任何时候改变QVector向量容器的体积。如果新的向量容器体积比以前的要大,QVector也许需要重新分配整个向量容器。QVector会预先分配两倍于实际数据的大小空间,从而减少再分配的次数。

reserve()函数,如果你事先知道向量容器大概包含多少个对象,你可以调用这个函数来预先分配一定的内存大小空间。

capacity()函数会告诉你向量容器所占内存的实际大小空间。

提醒:使用常量运算符和函数时会使QVector进行深度复制,这是隐含共享机制造成的。QVector的值的类型必须是可分配数据类型(assignable data type)。大多数数据类型都是这种类型。但是编译器不会让你存储一个QWidget,但是你可以存储QWidget指针啊!少数函数有额外的要求,比如indexOf()和lastIndexOf()期望值的类型可以支持operator==(),这些特殊要求在相关函数的文档上都有记录。

就像其它容器类一样,QVector支持Jave风格(QVectorIterator和QMutableVectorIterator)和STL风格的迭代器,实际上这些都很少使用,你可以使用索引号啊!

QVector不能插入、添加、替换一个QVector,否则你的应用程序就会报错!

QT,QVector 基本用法,遍历

QVector,是Qt对所有数组的封装,比如我们想要一个int类型数组,我们原先会写int array[10],我们在Qt里可以写QVector  array(10),赋值的时候,我们依然可以照旧array[5]=4;想获取某一项的值也还可以array[9],也就是说,原来的特性我们还可以用。

那么QVector有什么好处呢?我们可以用count函数获知数组中有多少个元素,方便遍历,原先我们必须预定义好大小,而用QVector我们虽然最好也先定义好大小,但是预先不定义也可以。我们可以使用append函数或者< 添加元素:          QVector strArray;             strArray.append("Hello"); //可以这样           strArray<::iterator iter;      for (iter=strArray.begin();iter!=strArray.end();iter++)      {          qDebug() <<  *iter << "\0";    }  插入:    strArray.insert(1,"这就是在hello和world之间添加");删除:    strArray.remove(1); //删除第一个元素,从0开始    strArray.remove(1,3); //从1开始,删除3个元素复制(取代):    strArray.replace(1,"LEO"); //删除第一个元素,从0开始上述,除了append()和replace()这两个函数外,其它函数会比较慢,因为在内存中移动一个位置时,这些函数会使向量容器内的对象要移动许多次!如果你想要一个能够在中部快速插入和删除的容器时,可以使用QList或者QLinkedList。

调用at()函数来读取对象会比使用operator[]()读取速度更快,因为这不会使用深度复制(deep copy)。

调用data()函数也可以访问保存在QVector的数据。这个函数会返回指向向量容器的第一个对象的指针。这样,你就可以使用指针来访问和修改向量容器内的对象。你可以使用指针将一个QVector向量容器传递给接收普通C++数组的函数。

contains()函数是用来查找向量容器内是否含有某个对象。

count()函数可以找出某个对象出现的次数。

resize()函数可以在任何时候改变QVector向量容器的体积。如果新的向量容器体积比以前的要大,QVector也许需要重新分配整个向量容器。QVector会预先分配两倍于实际数据的大小空间,从而减少再分配的次数。

reserve()函数,如果你事先知道向量容器大概包含多少个对象,你可以调用这个函数来预先分配一定的内存大小空间。

capacity()函数会告诉你向量容器所占内存的实际大小空间。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215270.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午2:17
下一篇 2026年3月18日 下午2:17


相关推荐

  • 系统运维面试题

    系统运维面试题1.什么是运维?什么是游戏运维?1)运维是指大型组织已经建立好的网络软硬件的维护,就是要保证业务的上线与运作的正常,在他运转的过程中,对他进行维护,他集合了网络、系统、数据库、开发、安全、监控于一身的技术,运维又包括很多种,有DBA运维、网站运维、虚拟化运维、监控运维、游戏运维等等2)游戏运维又有分工,分为开发运维、应用运维(业务运维)和系统运维开发运维:是给应用运维开发运维工具和运维平台的应用运维:是给业务上线、维护和做故障排除的,用开发运维开发出来的工具给业务上线、维护、做故障

    2022年6月1日
    212
  • vue模板字符串标签动态参数_vue模板字符串

    vue模板字符串标签动态参数_vue模板字符串模板字符串传统的 JavaScript 语言 输出模板通常是这样的写的 1 result append 2 Thereare basket count 3 itemsinyourb 4 basket onSale 5 areonsale 6 上面这种写法相当繁琐不方便 ES6 引入了模板字符串解决

    2026年3月16日
    1
  • Java 数组转 List 的 4 种方式

    Java 数组转 List 的 4 种方式目录前言【一】最常见方式(未必最佳)【二】数组转为List后,支持增删改查的方式【三】通过集合工具类Collections.addAll()方法(最高效)问题解答总结前言本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。【一】最常见方式(未必最佳)通过Arrays.asList(strArray)方式,将数组转换List后,不能对List增删,只能查改,否则抛异常。关键代码:Listlist=Arrays.asList(

    2022年8月23日
    7
  • Hook 技术「建议收藏」

    Hook 技术「建议收藏」一、原理钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。  钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息

    2022年5月26日
    46
  • J2ME开发环境配置(MyEclipse插件+WTK+jdk)

    J2ME开发环境配置(MyEclipse插件+WTK+jdk)MyeclipseJ2ME开发之环境配置的前言随着移动设备的普及和应用,在小型存储设备方面的研发进入了一个全新的时期,比如数字电视,PDA,移动存储通信设备等。而各方面的技术也进入了一个飞速发展的时期。尤其是近几年J2ME技术的发展。  而开发MIDlet应用程序有很多种开发工具可以选择,这些开发工具盒开发环境主要分为三大类:第一种是Sun公司的J2ME通用开发工具,例如J2ME无线开发工具包

    2022年7月27日
    6
  • java常见面试题及答案 11-20(JVM)

    11.JVM内存分哪几个区,每个区的作用是什么?java虚拟机主要分为以下一个区:方法区:1.有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载2.方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。3.该区域是被线程共享的。4.方法区里有

    2022年4月13日
    33

发表回复

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

关注全栈程序员社区公众号