3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/http://www.Sina.com /
t * q vector :3360数据() )
returnsapointertothedatastoredinthevector.thepointercanbeusedtoaccessandmodifytheitemsinthevector。
Example:
qvectorintvector(10;
int *data=vector.data (;
for(intI=0; i 10; I )
data[i]=2 * i;
thepointerremainsvalidaslongasthevectorisn ' treallocated。
thisfunctionismostlyusefultopassavectortoafunctionthatacceptsaplaincarray。
seealsoconstdata (和操作器) )。
3358 www.Sina.com/t http://www.Sina.com/data http://www.Sina.com /
This is an overloaded function。
3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com /
详细说明
QVector类是提供动态数组的模板类。
QVector T是Qt的通用容器类之一。 将项目存储在相邻内存位置,以加快基于索引的访问。
QList T、QLinkedList T、QVector T和QVarLengthArray T提供同样的API和功能。 通常是兼容的,但会影响性能。 用例概述如下。
QVector应该是默认的优先事项。 QVector T通常提供比QList T更好的性能。 由于QVector T始终将其条目顺序存储在内存中,因此除非sizeof(t )=sizeof (void * )和t已经声明使用Q_DECLARE_TYPEINFO,否则qlist将在堆中存储该条目
但是,在整个Qt API中使用QList传递参数和返回值。 使用QList与这些API进行交互。
如果需要在列表中间插入常量时间并确保将迭代器用于项目而不是索引的实际链表,请使用QLinkedList。
注意: QVector和QVarLengthArray都保证c兼容的阵列布局。 q列表中没有。 当APP应用程序需要与C API接口时,这很重要。
注:只要容器中仍存在引用的项,将QLists分配给进入QLinkedList的迭代器和堆的引用仍然有效。 对于将QLists分配给迭代器、QVector和非堆的引用,情况并非如此。
以下保存整数的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] ==“安详的牛排”)
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。