1.QVector
QVector是Qt框架中提供的一个动态数组类,它类似于C++标准库中的std::vector,但提供了更多的功能和便利性。以下是对QVector的详细介绍:
一、基本特性
- 动态大小:QVector可以根据需要自动调整大小,无需手动管理内存。
- 高效访问:QVector提供了快速的随机访问,可以通过索引直接访问元素。
- 插入和删除:QVector支持在任意位置插入和删除元素,自动调整数组大小。
- 自动复制:QVector在插入和复制元素时会自动进行深拷贝,确保数据的独立性。
- 内存优化:QVector会根据需要自动分配和释放内存,减少内存占用。
二、创建和初始化
QVector可以通过多种方式创建和初始化:
- 默认构造函数:创建一个空的QVector。
- 指定大小的构造函数:创建一个指定大小的QVector,所有元素都初始化为默认值。
- 指定大小和初始值的构造函数:创建一个指定大小并指定初始值的QVector。
- 使用std::initializer_list初始化:使用初始化列表来创建并初始化QVector。
- 拷贝构造函数:创建一个与已有QVector相同的新QVector对象。
- 从指针和大小初始化:使用C++数组初始化QVector。
- 使用std::vector初始化:将std::vector转换为QVector。
- 使用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提供了多种灵活的遍历方式,可以根据具体需求选择最适合的方法。在大多数情况下,使用索引遍历或范围循环是最简单和最直接的方式。
1421

被折叠的 条评论
为什么被折叠?



