【Qt】一文总结Qt序列式容器类—QVector

一文总结Qt序列式容器类—QVector

文章目录

        • 一、开篇
        • 二、QVector的使用方法
        • 三、QVector的重要成员函数API
          • (3-1)使用at()成员函数访问QVector中的数据
          • (3-2)使用data()成员函数访问QVector中的数据
          • (3-3)查找向量中出现的所有特定值
          • (3-4)对vector中值的检索
          • (3-5)添加、移动和删除vector中项的基本函数
          • (3-6)调整vector大小
        • 四、使用注意事项

一、开篇

​ QVector是一个提供动态数组的模板类,它将其项存储在相邻内存中,并提供基于索引的快速访问操作。

​ QVector应该是我们实际开发中的默认首选序列式容器。QVector通常比QList性能更好,因为QVector总是将它的项按顺序存储在内存中;对于QList来说,将在堆上分配它的项,除非sizeof(T) <= sizeof(void*)并且T已经使用Q_DECLARE_TYPEINFO声明为Q_MOVABLE_TYPE或Q_PRIMITIVE_TYPE。

二、QVector的使用方法

​ (2-1)创建QVector模板对象。例如:

QVector<QString>stringVector;

​ (2-2)创建QVector模板对象,并指明创建的元素个数。例如:

QVector<QString>stringVctor(200);

​ (2-3)创建QVector模板对象,并指明创建的元素个数,并使用值初始化方式初始化QVector。例如:

QVector<QString>stringVector(200,”hello world”)

​ 以上程序创建了200个元素的QVector,并使用hello world初始化了这200个元素。

三、QVector的重要成员函数API

(3-1)使用at()成员函数访问QVector中的数据
const T &QVector::at(int i) const

​ 例如:

for (int i = 0; i < vector.size(); ++i) {
    if (vector.at(i) == "iriczhao")
        cout << "iriczhao position :" << i << Qt::endl;
}
(3-2)使用data()成员函数访问QVector中的数据
T *QVector::data()

​ data()函数返回指向存储在vector中的数据的指针。该指针可用于访问和修改vector中的项。只要没有重新分配vector对象,返回的指针就仍然有效。这个函数主要用于将QVector传递给接受普通C++数组的函数。

(3-3)查找向量中出现的所有特定值
int QVector::indexOf(const T &value, int from = 0) const

​ indexOf函数用于返回vector中第一个出现value的索引位置,从索引位置向前搜索。如果没有匹配项,该函数返回-1。

int QVector::lastIndexOf(const T &value, int from = -1) const

​ 返回value在vector中最后一个出现的索引位置,从索引位置向后搜索。如果from是-1(默认值),则从最后一项开始搜索。如果没有匹配项,则返回-1。

(3-4)对vector中值的检索
bool QVector::contains(const T &value) const

​ 如果vector对象中存在value,则返回true;否则返回false。此函数要求value类型具有operator==()操作。

int QVector::count(const T &value) const

​ count()用于统计value在vector中出现的次数。

(3-5)添加、移动和删除vector中项的基本函数

​ 这些函数有insert()、replace()、remove()、prepend()、append()。除了append()和replace()之外,如果vector较大,这些函数操作可能比较慢(线性时间),因为它们需要在内存中将许多项在vector中移动位置。如果旭要一个在中间提供快速插入/删除操作的容器类,可以使用QList或QLinkedList。

QVector::iterator QVector::insert(QVector::iterator before, T &&value)
QVector::iterator QVector::insert(QVector::iterator before, const T &value)
void QVector::insert(int i, T &&value)
void QVector::insert(int i, const T &value)

​ 在向量的索引位置i处插入值。如果i为0,则该值被附加到vector对象上。如果i是size(),则值被追加到vector对象。


void QVector::replace(int i, const T &value)

将索引位置i的项替换为value。i必须是一个有效的向量索引位置(即i:0 <= i< size())。


void QVector::remove(int i)   //删除索引位置i的元素。
void QVector::remove(int i, int count) //从向量的索引位置i开始移除count元素。
(3-6)调整vector大小

​ 与普通C++数组不同,在任何时候,QVector可以通过调用resize()来调整大小。如果新设置的大小大于旧的大小,QVector可能会重新分配整个vector。在QVector内部实现中,试图通过预分配最多两倍于实际数据需要的内存来减少重新分配的数量。如果在开发中,我们预先知道QVector将包含多少项,可以调用reserve()函数让QVector预先分配一定数量的内存。还可以调用capacity()来查明在不强制重新分配的情况下存储在vector中的最大项数,有利于提高程序运行效率。

四、使用注意事项

​ (4-1)QVector的值类型必须是可分配的数据类型。包括基本类型(int和double)、指针类型和Qt数据类型(QString、QDate和QTime),但不包括QObject或QObject的子类(QWidget、QDialog、QTimer等)。如果希望在容器中存储这些类型的对象,可以将它们存储为指针,例如QList,这一条在实际使用QVector中经常使用到。

​ (4-2)QVector不支持插入、前置、附加或替换对其自身值的引用。这样会导致应用程序中止,并显示错误消息。


搜索关注【嵌入式小生】wx公众号获取更多精彩内容>>>>
请添加图片描述

你可能感兴趣的:(小生聊【Qt】,qt,开发语言,C++,序列式容器,QVector)