QVector应用大全

一.概述

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

QVector 本质就是封装好的数组,向量的相邻元素在内存里是连续存储的,可以用数组下标访问,其读取和修改元素的操作是非常快的

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

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

二.程序示例

1.包含头文件 #include <QVector>

2.声明初始化

下面是一个存储整数的QVector和存储QString的QVector的例子:

  QVector<int> integerVector;

  QVector<QString> stringVector;

通常,vector是用初始大小创建的。

例如,下面的代码构造了一个包含200个元素的QVector:

QVector<QString> vector(200);

元素会自动用默认构造的值初始化(如果是int、double之类的话就是 0, QString就是空字符串)。如果你想用不同的值初始化vector,将该值作为第二个参数传递给构造函数:

QVector<QString> vector(200, "Pass");

还可以在任何时候调用 fill() 来用值填充 QVector:

  QVector<QString> vector(3);

  vector.fill("Yes");

  // vector: ["Yes", "Yes", "Yes"]

  vector.fill("hi", 5);

  // vector: ["hi", "hi", "hi", "hi", "hi"]

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;

}

(2)如果你想找到一个向量中某个特定值的所有出现情况,可以使用indexOf()或lastIndexOf()。 前者从给定的索引位置开始向前搜索,后者向后搜索。如果找到匹配项,两者都会返回匹配项的索引;否则,返回-1。例如:

  int i = vector.indexOf("Harumi");

  if (i != -1)

03-20
### QVector 的基本概念与用法 `QVector<T>` 是 Qt 提供的一种动态数组容器,类似于 C++ 标准库中的 `std::vector`。它提供了高效的随机访问操作以及动态调整大小的功能[^1]。 以下是关于 `QVector` 的一些重要特性及其常见用途: #### 创建和初始化 可以使用多种方式创建并初始化 `QVector` 对象: ```cpp // 默认构造函数,初始容量为0 QVector<int> vector; // 使用指定数量的默认值进行初始化 QVector<int> vector(5, 0); // 初始化一个包含五个整数且都设置为0的向量 // 复制另一个 QVector QVector<int> anotherVector(vector); ``` #### 动态扩展与收缩 `QVector` 支持通过追加元素来自动扩展其内部存储空间: ```cpp vector.append(10); // 添加单个元素到末尾 vector += {20, 30}; // 追加多个元素 vector.resize(10); // 调整向量大小至10个元素,默认填充为T类型的零值 ``` 如果需要手动管理内存分配,则可以通过以下方法实现更高效的操作: ```cpp vector.reserve(100); // 预留至少能容纳100个元素的空间,减少多次重新分配带来的开销 ``` #### 访问元素 支持索引运算符 (`[]`) 和成员函数 `.at()` 来获取或修改特定位置上的数据项: ```cpp int value = vector[0]; // 获取第一个元素 value = vector.at(0); // 同样效果但越界时会抛出异常 if (!vector.isEmpty()) { int lastElement = vector.last(); // 取得最后一个元素而不移除 } ``` 需要注意的是,在多线程环境中直接共享同一个 `QVector` 实例可能会引发竞态条件问题;因此建议采用只读模式或者利用互斥锁保护共享资源[^2]。 #### 性能考量与其他容器对比 尽管 STL 容器如 `std::vector` 在某些情况下可能提供更好的性能表现,但在完全基于Qt框架构建的应用程序里头,选用 `QVector` 往往能够简化接口适配工作,并保持一致性的编码风格。 --- ### 示例代码展示如何有效运用 QVector 下面给出一段简单的例子演示了上述提到的一些功能点: ```cpp #include <QVector> #include <QDebug> void demonstrateQVectorUsage() { QVector<int> numbers; // 插入几个数值进去 for(int i=1;i<=5;++i){ numbers << i*2; // 等价于numbers.append(i*2); } qDebug() << "Original list:" << numbers; // 修改第二个元素 if(numbers.size()>1){ numbers[1]=99; } qDebug() << "Modified second item:" << numbers; } demonstrateQVectorUsage(); ``` 运行此段程序将会打印如下输出结果: ``` Original list: QVector(2, 4, 6, 8, 10) Modified second item: QVector(2, 99, 6, 8, 10) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI+程序员在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值