一、利用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<int> 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.

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

详细说明

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

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

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

QVector应该是您的默认首选。 QVector <T>通常会提供比QList <T>更好的性能,因为QVector <T>总是将其项顺序存储在内存中,其中QList <T>将在堆上分配其项,除非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 <int> integerVector;

QVector <QString> stringVector;

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

QVector <QString> vector(200);

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

QVector <QString> vector(200,“Pass”);

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

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

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

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

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

for(int i = 0; i <vector.size(); ++ 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。

QT中QVector的基本用法相关推荐

  1. Qt中两种定时器用法

    在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度. 1.QObject类的定时器 QObj ...

  2. QT中QVector的使用

    当我们想用数组时,但是又不知道数组的大小,数组的大小是根据实际情况变化的,不确定的,这是我们就要为数组动态分配空间,这时,我们可以考虑两种情况:(1)在c++中使用new()和delete(),在c中 ...

  3. QT中Model-View-Delegate委托代理机制用法介绍

    文章目录 本地数据加载(Data) 添加数据模型(Model) 添加代理模型(Proxy) 添加元素的代理(Delegate) 添加视图层(View) 使用效果 之前的一篇文章中介绍过QT的委托代理机 ...

  4. Qt中QVector赋值速度与数组赋值速度的测试比较

    工作中需要解析mono12 packet format 格式的灰度图数据,数据大小为100M,自己写代码将其解析成16位的short的时候,耗时都特别长需要5s才能解析完,后来我发现是用了QVecto ...

  5. Qt中setData()和data()用法

    简述 最近在一个项目要到了setData()和data() 常见接口 1.**setdata()**存储数据 2.**data()**取出数据 单独存储 1.通过setData(),我们可以单独存储用 ...

  6. Qt中sender()函数的用法

    你在一个槽里面,调用这个函数,返回的就是你信号来源的对象: QPushButton *aaaa = new QPushButton(this); 比如 connect(aaaaa, SIGNAL(Cl ...

  7. Qt中SQL QSqlQuery 对象中prepare() 函数的用法

    Qt中利用SQL对数据库的操作和prepare()函数的使用 Qt数据库的初学说明 Qt中可以建立一个数据库,比如:QSqlDatabasedb:这是一个数据库对象db,在操作之前我们需要用QSQLI ...

  8. QT中connect函数的几种用法详解总结

    前言 信号与槽机制是QT非常核心的东西,通过信号与槽我们可以将不同的部分有机的结合起来,使得各个组件之间的交互简单高效,信号与曹槽像是设计模式中的观察者模式(我自己觉得是这样),只关心信号何时发来,以 ...

  9. QT中QString的所有类用法大全

    前言 之前用到QT中QString的用法,但总是忘记,这次自己整理出来,自己想用可以随时查看,同时也可以帮助到大家. 文章目录 前言 一.QString与其他变量的转换 1.QString::numb ...

最新文章

  1. JUC并发编程六 并发架构--偏向锁
  2. 解决 APP启动白屏黑屏问题
  3. mysql5.7+ 虚拟列,json使用初体验
  4. 电脑键盘上每个键作用
  5. Hibernate学习笔记--映射配置文件详解
  6. 如何验证是否正确安装了CUDA
  7. java伪唤醒,谈谈JDK线程的伪唤醒
  8. java file.listFiles()按文件名称、日期、大小排序
  9. poi实现百万级数据导出
  10. 计算机思维与计算文化,计算文化与计算思维基础
  11. 凸优化第七章统计估计 7.3最优检测器设计及假性检验
  12. 【项目实践】充电台灯电路拆解
  13. c语言中文件的四种读取方法
  14. 工业级路由器和家用路由器的区别_工业路由器与家用路由器有什么区别?
  15. 互换性测量技术-几何误差
  16. fatal error C1859的有效解决办法
  17. 强化学习(七):n步自举法(多步引导法)
  18. pc调试微信h5页面提示Pending authentication:please accept debugging session on the device的解决方法
  19. 万能应用市场删除后台自动安装
  20. CAD偏移尺寸出问题该如何解决?

热门文章

  1. vts传感器采取船舶的_中船重工船舶交通管理系统研发应用成效显著
  2. 博客的评论与回复功能的实现
  3. 福田国资引入电子合同,勇当数字治理排头兵
  4. 冲激串函数的傅里叶变换还是冲激串函数!?
  5. vivoX30是android5的吗,vivo X30配置怎么样 vivo X30手机配置及发售时间介绍
  6. 基于Java语言的学习路线
  7. ubuntu 重启命令,ubuntu 重启网卡方法
  8. linux 进程 stdout,linux下的stdin,stdout和stderr理解和程序实例分析
  9. jQuery绑定点击事件和改变事件的几种方式以及多个元素绑定多个事件
  10. 如何恢复硬盘数据?简单解决问题