QT中QVector的基本用法

QT中QVector的基本用法一 利用 data 把 QVector 中的数据取出来 T QVector data Returnsapoin Thepointerca Example QVector

一、利用dataQVector中的数据取出来

T *QVector::data()

Returns a pointer to the data stored in the vector. The pointer can be used to access and modify the items in the vector.

Example:

 

 

QVector

vector(10);

 

int *data = vector.data();

 

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

 

data[i] = 2 * i;

 

The pointer remains valid as long as the vector isn’t reallocated.

This function is mostly useful to pass a vector to a function that accepts a plain C++ array.

See also constData() and operator[]().

const T *QVector::data() const

This is an overloaded function.

 

QT中QVector的基本用法

二、关于QVector的整体使用的介绍

详细说明

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

QVector

是Qt的通用容器类之一。它将其项目存储在相邻的内存位置,并提供快速的基于索引的访问。

QList

,QLinkedList

,QVector

和QVarLengthArray

提供类似的API和功能。它们通常可以互换,但会产生性能影响。以下是用例概述:



QVector应该是您的默认首选。 QVector

通常会提供比QList

更好的性能,因为QVector

总是将其项顺序存储在内存中,其中QList

将在堆上分配其项,除非sizeof(T)<= sizeof(void *)和T已使用Q_DECLARE_TYPEINFO声明为Q_MOVABLE_TYPE或Q_PRIMITIVE_TYPE。有关说明,请参阅使用QList的优点和缺点。



但是,在整个Qt API中使用QList来传递参数和返回值。使用QList与这些API进行交互。

如果您需要一个真实的链表,它保证在列表中间插入常量时间并将迭代器用于项而不是索引,请使用QLinkedList。

注意:QVector和QVarLengthArray都保证C兼容的阵列布局。 QList没有。如果您的应用程序必须与C API接口,这可能很重要。

注意:只要引用的项保留在容器中,进入QLinkedList的迭代器和对堆分配QLists的引用仍然有效。对于迭代器和对QVector和非堆分配QLists的引用,情况并非如此。

以下是存储整数的QVector和存储QString值的QVector的示例:

 

  QVector

integerVector;

  QVector

stringVector;

 

QVector将其项目存储在向量(数组)中。通常,使用初始大小创建向量。例如,以下代码构造一个包含200个元素的QVector:

 

  QVector

vector(200);

 

元素将使用默认构造的值自动初始化。如果要使用不同的值初始化向量,请将该值作为第二个参数传递给构造函数:

 

  QVector

vector(200,“Pass”);

 

您也可以随时调用fill()以使用值填充向量。

QVector使用基于0的索引,就像C ++数组一样。要访问特定索引位置的项目,可以使用operator []()。在非常量向量上,operator []()返回对可在赋值左侧使用的项的引用:

 

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

      vector [0] =“伊丽莎白”;

 

对于只读访问,另一种语法是使用at():

 

  for(int i = 0; i

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

          cout <<“在位置上找到阿方索”<< i << endl;

  }

 

at()可以比operator []()更快,因为它永远不会导致深层复制。

访问存储在QVector中的数据的另一种方法是调用data()。该函数返回指向向量中第一项的指针。您可以使用指针直接访问和修改存储在向量中的元素。如果需要将QVector传递给接受普通C ++数组的函数,则该指针也很有用。

如果要在向量中查找特定值的所有匹配项,请使用indexOf()或lastIndexOf()。前者从给定的索引位置开始向前搜索,后者向后搜索。如果匹配项找到一个,则返回匹配项的索引;否则,他们返回-1。例如:

 

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

  if(i!= -1)

      cout <<“Harumi第一次出现在位置”<< i << endl;

 

如果您只想检查向量是否包含特定值,请使用contains()。如果要查找向量中特定值出现的次数,请使用count()。

QVector提供了添加,移动和删除项目的基本功能:insert(),replace(),remove(),prepend(),append()。除了append()和replace()之外,对于大向量,这些函数可能很慢(线性时间),因为它们需要将向量中的许多项移动到内存中的一个位置。如果您想要一个在中间提供快速插入/删除的容器类,请改用QList或QLinkedList。

与普通的C ++数组不同,可以通过调用resize()随时调整QVectors的大小。如果新大小大于旧大小,QVector可能需要重新分配整个向量。 QVector尝试通过预分配最多两倍于实际数据需求的内存来减少重新分配的数量。

如果您事先知道QVector将包含多少项,您可以调用reserve(),要求QVector预先分配一定量的内存。您还可以调用capacity()来查找QVector实际分配的内存量。

请注意,使用非const运算符和函数可能会导致QVector执行数据的深层复制。这是由于隐式共享。

QVector的值类型必须是可分配的数据类型。这涵盖了大多数常用的数据类型,但编译器不会让你这么做

例如,将QWidget存储为值;相反,存储QWidget *。一些功能有额外的要求;例如,indexOf()和lastIndexOf()期望值类型支持operator ==()。这些要求按功能记录。

与其他容器类一样,QVector提供Java样式的迭代器(QVectorIterator和QMutableVectorIterator)和STL样式的迭代器(QVector :: const_iterator和QVector :: iterator)。在实践中,这些很少使用,因为您可以将索引用于QVector。

除了QVector之外,Qt还提供了QVarLengthArray,这是一个非常低级的类,具有针对速度优化的少量功能。

QVector不支持插入,添加,附加或替换对其自身值的引用。这样做会导致应用程序中止并显示错误消息。

有关使用Qt容器的更多信息

有关将Qt容器相互比较以及与STL容器进行比较的详细讨论,请参阅了解Qt容器。

另请参见QVectorIterator,QMutableVectorIterator,QList和QLinkedList。

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

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

(0)
上一篇 2026年3月18日 下午11:21
下一篇 2026年3月18日 下午11:22


相关推荐

  • Netty权威指南_ck2威望代码

    Netty权威指南_ck2威望代码学习《netty权威指南时》发现有的代码有误,我都更正了一下,可运行的代码可以访问我的github:https://github.com/wangdecheng/mycodes/tree/master/src/main/java/netty

    2026年4月15日
    4
  • 隐形数字水印_Android 实现图片水印与隐形数字水印

    隐形数字水印_Android 实现图片水印与隐形数字水印在使用知乎,微博的时候,我们经常可以看到自己上传的图片被加上了文字水印,在实际的应用开发过程中,很多客户端都需要开发者自己编写Canvs绘制图形水印的方法,今天我想在这里介绍一个轻量级的开源Android图片水印框架来避免开发过程中编写复杂的绘图代码:AndroidWM,并且剖析它的实现过程和特色用法。水印这个框架最大程度上简化了图片水印绘制的问题,暴露了灵活的接口给用户使用。在绘制水印的…

    2025年5月29日
    2
  • python基础系列教程——python面向对象编程全解

    python基础系列教程——python面向对象编程全解全栈工程师开发手册 作者 栾鹏 python 教程全解 python 面向对象编程全解 面向对象技术简介类 Class 用来描述具有相同的属性和方法的对象的集合 它定义了该集合中每个对象所共有的属性和方法 对象是类的实例 对象是类实例化之后的结果 类变量 类变量在整个实例化的对象中是公用的 类变量定义在类中且在函数体之外 类变量通常不作为实例变量使用 数据成员 类变量或者实例变量用于

    2026年3月20日
    2
  • 红队评估实战靶场(1)

    0x00前言[滑稽][滑稽]又是我,我又来发水文了,这几天打靶机打上瘾了,再来更新篇靶机的文章0x01靶机渗透配置好靶机后,这里需要打开win7,来到c盘目录下启动phpstudy启动完成后

    2021年12月11日
    39
  • ireport使用教程_计算机初学者入门教程

    ireport使用教程_计算机初学者入门教程一、iReport 是什么    iReport是一个能够创建复杂报表的开源项目,并且它能调用JasperReports库应用于任何一种Java应用程序。本身是分布式的且由符合GNU通用公共许可的百分之百纯java编写。由于它丰富的图形界面,你能够很快的创建出任何一种你想要的报表。iReport能够让我们提高技术方面的信心,比如它能降低学习JasperReports的XML语法的难

    2025年10月24日
    5
  • 半监督学习概述

    半监督学习概述一 半监督学习今天在阅读一篇论文时了解了这个之前一直不太清晰的概念 下面是查阅了相关资料后对半监督学习的理解 如有错误 望更正 半监督学习是一种介于监督学习和无监督学习之间的学习凡是 我们都知道 在监督学习中 样本的类比 类别标签都是已知的 学习的目的是找到样本的特征与类别标签之间的联系 一般来讲训练样本的数量越多 训练得到的分类器的分类精度也会越高 但是在很多现实问题当中 一方面是由于人工标记样本的成本很高 导致有标签的数据十分稀少 如果是让算法工程师亲自去标记数据 会消耗相当大的时间和精力 也有很

    2026年3月18日
    2

发表回复

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

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