QVector

1.QVector

QVector是Qt框架中提供的一个动态数组类,它类似于C++标准库中的std::vector,但提供了更多的功能和便利性。以下是对QVector的详细介绍:

一、基本特性

  • 动态大小:QVector可以根据需要自动调整大小,无需手动管理内存。
  • 高效访问:QVector提供了快速的随机访问,可以通过索引直接访问元素。
  • 插入和删除:QVector支持在任意位置插入和删除元素,自动调整数组大小。
  • 自动复制:QVector在插入和复制元素时会自动进行深拷贝,确保数据的独立性。
  • 内存优化:QVector会根据需要自动分配和释放内存,减少内存占用。

二、创建和初始化

QVector可以通过多种方式创建和初始化:

  1. 默认构造函数:创建一个空的QVector。
  2. 指定大小的构造函数:创建一个指定大小的QVector,所有元素都初始化为默认值。
  3. 指定大小和初始值的构造函数:创建一个指定大小并指定初始值的QVector。
  4. 使用std::initializer_list初始化:使用初始化列表来创建并初始化QVector。
  5. 拷贝构造函数:创建一个与已有QVector相同的新QVector对象。
  6. 从指针和大小初始化:使用C++数组初始化QVector。
  7. 使用std::vector初始化:将std::vector转换为QVector。
  8. 使用QList初始化:将QList转换为QVector。

三、元素访问

QVector提供了多种访问元素的方式:

  • operator[]:通过索引访问元素,返回指定索引处的元素的引用。对于非const向量,这允许赋值操作。
  • at():通过索引访问元素,会检查索引是否越界。如果索引有效,返回指定索引处的元素的引用。
  • data():返回指向vector中第一项的指针,允许使用指针直接访问和修改存储在vector中的元素。

四、添加和移除元素

QVector提供了多种添加和移除元素的方法:

  • append():在容器末尾添加一个元素。
  • prepend():在容器开头添加一个元素。
  • insert():在指定位置插入一个元素或多个相同元素。
  • remove():移除指定位置的元素或从开始位置移除指定数量的元素。
  • removeAll():移除容器中所有等于给定值的元素。
  • removeOne():移除容器中第一个等于给定值的元素。
  • clear():清空容器中的所有元素。

五、大小和容量

QVector提供了获取和调整其大小和容量的方法:

  • size():获取容器中元素的数量。
  • capacity():获取容器的容量。
  • reserve():预分配指定数量的元素空间,提高性能。
  • squeeze():释放未使用的容量,将容量调整为实际元素数量。
  • resize():调整容器的大小,新元素会被默认值初始化。

六、查找和排序

QVector还提供了查找和排序功能:

  • indexOf():从指定位置开始查找给定值的元素,返回第一个找到的元素的索引。
  • lastIndexOf():从指定位置开始向前查找给定值的元素,返回第一个找到的元素的索引。
  • contains():判断容器中是否包含给定值的元素。
  • count():计算容器中给定值的元素的个数。
  • sort():对容器中的元素进行排序,可以指定升序或降序。
  • stableSort():对容器中的元素进行稳定排序,可以指定升序或降序。

七、其他常用功能

QVector还提供了其他一些常用功能,如使用迭代器遍历元素、判断容器是否为空等。

总之,QVector是Qt框架中一个功能强大的动态数组类,它提供了丰富的功能和接口,便于管理和操作动态数组。无论是在图形界面编程、数据处理还是其他领域,QVector都是一个非常实用的工具。

2.QVector常用接口 

QVector 是 Qt 框架中的一个模板类,提供了一个动态数组的实现。它常用于存储相同类型的元素,并提供了一系列方便的接口来操作这些元素。以下是 QVector 的一些常用接口:

一、构造函数与析构函数

  • QVector(): 构造一个空的 QVector。
  • QVector(int size, const T &value = T()): 构造一个包含 size 个元素的 QVector,每个元素都初始化为 value
  • QVector(const QVector<T> &other): 构造一个与 other 相同的 QVector(拷贝构造)。
  • ~QVector(): 析构函数,释放 QVector 使用的资源。

二、元素访问

  • T &operator[](int i): 返回索引 i 处的元素的引用。
  • const T &operator[](int i) const: 返回索引 i 处的元素的常量引用。
  • T &at(int i): 返回索引 i 处的元素的引用,并进行越界检查。
  • const T &at(int i) const: 返回索引 i 处的元素的常量引用,并进行越界检查。
  • T *data(): 返回指向 QVector 中第一个元素的指针。
  • const T *data() const: 返回指向 QVector 中第一个元素的常量指针。

三、添加和移除元素

  • void append(const T &value): 在 QVector 末尾添加一个元素。
  • void prepend(const T &value): 在 QVector 开头添加一个元素。
  • void insert(int i, const T &value): 在索引 i 处插入一个元素。
  • void insert(int i, int count, const T &value): 在索引 i 处插入 count 个相同的元素。
  • void remove(int i): 移除索引 i 处的元素。
  • void remove(int i, int count): 从索引 i 处开始移除 count 个元素。
  • void removeAll(const T &value): 移除 QVector 中所有等于 value 的元素。
  • void removeOne(const T &value): 移除 QVector 中第一个等于 value 的元素。
  • void clear(): 清空 QVector 中的所有元素。

四、大小和容量

  • int size() const: 返回 QVector 中元素的数量。
  • int capacity() const: 返回 QVector 可以容纳的元素数量(不一定等于 size())。
  • void reserve(int size): 预分配至少 size 个元素的空间。
  • void squeeze(): 释放多余的内存,使 QVector 的容量等于其大小。
  • void resize(int size): 调整 QVector 的大小,如果新大小大于旧大小,则新元素将被默认初始化。

五、查找和排序

  • int indexOf(const T &value, int from = 0) const: 从索引 from 开始查找 value,返回第一个找到的元素的索引。
  • int lastIndexOf(const T &value, int from = -1) const: 从索引 from 开始向前查找 value,返回第一个找到的元素的索引。
  • bool contains(const T &value) const: 检查 QVector 是否包含 value
  • int count(const T &value) const: 返回 QVector 中等于 value 的元素的数量。
  • void sort(): 对 QVector 中的元素进行升序排序。
  • void stableSort(): 对 QVector 中的元素进行稳定升序排序。

六、迭代器

  • QVector<T>::iterator begin(): 返回指向 QVector 中第一个元素的迭代器。
  • QVector<T>::const_iterator begin() const: 返回指向 QVector 中第一个元素的常量迭代器。
  • QVector<T>::iterator end(): 返回指向 QVector 中最后一个元素之后的迭代器。
  • QVector<T>::const_iterator end() const: 返回指向 QVector 中最后一个元素之后的常量迭代器。

七、其他

  • QVector<T> &operator=(const QVector<T> &other): 赋值操作符,将 other 赋值给当前 QVector。
  • bool isEmpty() const: 检查 QVector 是否为空。
  • bool operator==(const QVector<T> &other) const: 检查两个 QVector 是否相等。
  • bool operator!=(const QVector<T> &other) const: 检查两个 QVector 是否不相等。

这些接口提供了对 QVector 的全面操作,包括构造、访问、添加、移除、查找、排序以及其他一些实用功能。通过这些接口,你可以方便地管理和操作 QVector 中的元素。

 

QVector遍历 

QVector提供了多种方式来遍历其存储的元素。以下是几种常用的遍历QVector的方法:

一、使用索引遍历

由于QVector支持随机访问,因此可以通过索引来遍历其元素。这种方法简单且高效,特别适用于需要频繁访问元素的场景。


cpp复制代码

QVector<int> vector = {1, 2, 3, 4, 5};
for (int i = 0; i < vector.size(); ++i) {
qDebug() << vector[i];
}

二、使用迭代器遍历

QVector提供了迭代器(iterator)和常量迭代器(const_iterator)来遍历其元素。迭代器提供了一种更通用的方式来访问容器中的元素,而不需要关心容器的具体实现。


cpp复制代码

QVector<int> vector = {1, 2, 3, 4, 5};
for (QVector<int>::iterator it = vector.begin(); it != vector.end(); ++it) {
qDebug() << *it;
}

对于不需要修改元素的情况,建议使用常量迭代器来遍历:


cpp复制代码

QVector<int> vector = {1, 2, 3, 4, 5};
for (QVector<int>::const_iterator it = vector.cbegin(); it != vector.cend(); ++it) {
qDebug() << *it;
}

三、使用范围循环(C++11及以上)

在C++11及更高版本中,可以使用范围循环(range-based for loop)来更简洁地遍历QVector。这种方法不需要显式地管理迭代器或索引,使代码更加易读和简洁。


cpp复制代码

QVector<int> vector = {1, 2, 3, 4, 5};
for (const int &value : vector) {
qDebug() << value;
}

如果不需要修改元素的值,可以将const int &替换为int,但这样会导致每次迭代时都进行拷贝操作,可能不如使用引用高效。

四、使用STL算法

QVector可以与STL算法结合使用,通过提供适当的迭代器来应用算法。例如,可以使用std::for_each算法来遍历QVector并应用一个函数对象:


cpp复制代码

#include <algorithm> // for std::for_each
#include <QDebug> // for qDebug()
QVector<int> vector = {1, 2, 3, 4, 5};
std::for_each(vector.begin(), vector.end(), [](int value) {
qDebug() << value;
});

五、使用Qt的辅助函数

Qt本身也提供了一些辅助函数来遍历容器,例如qForAll(在Qt 5中已弃用,建议使用C++11的范围循环或STL算法)。不过,对于QVector来说,通常使用上面介绍的方法就足够了。

总的来说,QVector提供了多种灵活的遍历方式,可以根据具体需求选择最适合的方法。在大多数情况下,使用索引遍历或范围循环是最简单和最直接的方式。

 

08-13
Qt 的 `QVector` 是一个模板类,用于管理动态数组,提供了高效的随机访问和动态大小调整功能。`QVector` 在内部使用连续的内存块存储元素,因此非常适合需要频繁访问元素的场景。其接口设计简洁,功能强大,常用于存储和操作线性数据集合。 ### 常用功能与操作 `QVector` 提供了多种方式来操作数据,包括添加、删除、访问和修改元素。以下是一些常见的使用方法: - **初始化 QVector** 可以通过默认构造函数创建一个空的 `QVector`,也可以在构造时指定初始大小或初始值。 ```cpp QVector<int> vec1; // 创建一个空的 QVector QVector<int> vec2(5); // 创建一个包含 5 个元素的 QVector,每个元素初始化为 0 QVector<int> vec3(5, 10); // 创建一个包含 5 个元素的 QVector,每个元素初始化为 10 ``` - **添加元素** 使用 `append()` 或 `push_back()` 方法在 `QVector` 的末尾添加元素。 ```cpp vec1.append(20); // 向 vec1 添加一个元素 20 vec1.push_back(30); // 同上,vec1 现在包含 20 和 30 ``` - **访问元素** 使用索引操作符 `[]` 或 `at()` 方法访问 `QVector` 中的元素。`at()` 是只读的,而 `[]` 允许修改元素。 ```cpp int value = vec1[0]; // 获取第一个元素 int constValue = vec1.at(0); // 获取第一个元素(只读) ``` - **修改元素** 可以通过索引操作符 `[]` 直接修改 `QVector` 中的元素。 ```cpp vec1[0] = 25; // 修改第一个元素为 25 ``` - **删除元素** 使用 `removeAt()` 方法删除指定位置的元素,或使用 `clear()` 删除所有元素。 ```cpp vec1.removeAt(0); // 删除第一个元素 vec1.clear(); // 清空整个 QVector ``` - **获取 QVector 状态** 使用 `size()` 获取当前 `QVector` 中的元素数量,使用 `isEmpty()` 检查 `QVector` 是否为空。 ```cpp int size = vec1.size(); // 获取元素数量 bool empty = vec1.isEmpty(); // 检查是否为空 ``` ### 性能与内存管理 `QVector` 在内部使用连续的内存块来存储数据,因此访问元素的速度非常快,时间复杂度为 O(1)。然而,插入或删除中间位置的元素可能会导致性能下降,因为需要移动大量数据。如果频繁进行插入或删除操作,可以考虑使用 `QList` 或 `QLinkedList`。 此外,`QVector` 支持自动扩容,当添加的元素超过当前分配的内存时,它会自动增加内存容量。这种机制通常会预留额外的空间以减少重新分配的次数。 ### 示例代码 以下是一个完整的示例,展示了如何使用 `QVector` 来存储和操作数据: ```cpp #include <QVector> #include <QDebug> int main() { QVector<int> numbers; // 添加元素 numbers.append(10); numbers.append(20); numbers.append(30); // 输出元素数量 qDebug() << "Size:" << numbers.size(); // 访问和修改元素 numbers[1] = 25; // 遍历 QVector for (int i = 0; i < numbers.size(); ++i) { qDebug() << "Element at index" << i << ":" << numbers[i]; } // 删除元素 numbers.removeAt(0); // 再次遍历 QVector for (int num : numbers) { qDebug() << "Remaining element:" << num; } return 0; } ``` ### 文档与资源 Qt 官方文档提供了详细的 `QVector` 使用说明和示例[^1]。开发者可以通过查阅 Qt 的在线文档或离线文档来获取更多关于 `QVector` 的信息,包括高级用法、性能优化技巧以及与其他容器类的比较。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值