QT中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<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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值