Qt 技巧笔记(四)QVector 的底层原理与高级用法(一)
QVector 是Qt框架中的一个动态数组类,用于存储相同类型的元素。QVector内部使用连续内存存储元素。QVector内部使用连续内存存储元素,提供了随机访问、插入和删除等操作。以下是一些典型的QVector应用场景:
1.随机访问:由于QVector内部使用连续内存存储元素,它提供了快速的随机访问能力。这使得QVector在需要频繁访问数据集中任意元素的场景下非常适用。
2.动态数组:QVector可以根据需要自动调整大小,这使得它在处理不确定大小的数据集时非常有用。在需要动态调整数组大小的场景下,QVector比固定大小的数组更加灵活。
3.高效的插入和删除:QVector在尾部插入和删除元素非常高效。这使得QVector在需要频繁添加或删除尾部元素的场景下非常合适。
4.缓存和缓冲区:QVector可以用作缓存或缓冲区,用于存储从外部数据源(如文件、网络等)接收到的数据。这可以提高数据处理速度,避免频繁访问外部数据源。
5.图形和数据可视化:在处理图形和数据可视化任务时,QVector可以用于存储点、颜色、纹理坐标等数据。它可以与Qt的绘图和数据可视化工具一起使用,如QPainter和QCustomPlot。
1.1 QVector 的重要性与简介
在计算机编程的世界中,数据结构是一个核心概念,它为我们提供了有效组织和存储数据的方法。在众多数据结构中,向量(Vector)作为一种动态数组,因其灵活性和高效性受到广泛的关注。特别是在使用Qt框架进行C++编程时,QVector成为程序员的有利工具。
QVector是Qt容器类库中的一个重要组成部分,它提供了类似于C++标准库中的std::vector的功能,但同时拥有Qt独特的优势。QVector 是一个动态数组,可以容纳任意数量的元素,支持在末尾添加、插入和删除元素。与其他容器相比,QVector在随机访问元素时具有出色的性能,同时在尾部添加和删除元素时依能保持较高的效率。
1.2 QVector的常用方法接口
QVector是Qt框架中一个用于存储数据的容器类,它可以存储各种类型的数据结构,如整数、浮点数、自定义类等。QVector 类提供了多种用于操作数据的接口方法。以下是一些常用接口的详细介绍:
- 构造函数
| API 接口 | 功能介绍 |
|---|---|
QVector() |
创建一个空的 QVector 容器 |
QVector(int size) |
创建一个指定大小的 QVector 容器。 |
QVector(int size, const T &value) |
创建一个指定大小的 QVector 容器,并用给定值填充。 |
QVector(const QVector<T> &other) |
复制构造函数,用另一个 QVector 容器创建一个新的 QVector 容器。 |
-
元素访问
API 接口 功能访问 T &operator[](int i)通过索引访问元素,返回指定索引处的元素的引用。 const T &operator[](int i) const以只读方式通过索引访问元素 T &at(int i)通过索引访问元素,会检查索引是否越界 T &front()返回容器中的第一个元素的引用。 -
获取QVector容量和大小
| API 接口 | 功能访问 |
|---|---|
bool isEmpty() const |
判断容器是否为空 |
int size() const |
获取容器中元素的数量 |
int capacity() const |
获取容器的容量 |
void reserve(int size) |
预分配指定数量的元素空间,提高性能 |
| void squeeze() | 释放未使用的容量,将容量调整为实际元素数量。 |
- 修改容器:
| API 接口 | 功能访问 |
|---|---|
void clear() |
清空容器中的所有元素 |
void resize(int size) |
调整容器的大小 |
void fill(const T &value, int size = -1) |
用给定值填充容器,可以指定填充个数 |
void append(const T &value) |
在容器末尾添加一个元素 |
void prepend(const T &value) |
在容器开头添加一个元素 |
void insert(int i, const T &value) |
在指定位置插入一个元素 |
void replace(int i, const T &value) |
替换指定位置的元素 |
void remove(int i) |
移除指定位置的元素 |
void remove(int i, int count) |
从指定位置开始移除指定数量的元素 |
void removeAll(const T &value) |
移除容器中所有等于给定值的元素 |
bool removeOne(const T &value) |
移除容器中第一个等于给定值的元素 |
- 查找容器:
| API 接口 | 功能访问 |
|---|---|
int indexOf(const T &value, int from = 0) const |
从指定位置开始查找给定值的元素,返回第一个找到的元素的索引 |
| int count(const T &value) const | 计算容器中给定值的元素的个数。 |
int lastIndexOf(const T &value, int from = -1) const |
排序:从指定位置开始向前查找给定值的元素,返回第一个找到的元素的索引 |
bool contains(const T &value) const |
判断容器中是否包含给定值的元素 |
- 排 序:
| API 接口 | 功能访问 |
|---|---|
void sort(Qt::SortOrder order = Qt::AscendingOrder) |
对容器中的元素进行排序,可以指定升序或降序 |
void stableSort(Qt::SortOrder order = Qt::AscendingOrder) |
对容器中的元素进行稳定排序,可以指定升序或降序 |
-
比较操作符:
API 接口 功能介绍 QVector<T> &operator=(const QVector<T> &other)赋值操作符,将一个 QVector 容器赋值给另一个 QVector<T> mid(int pos, int length = -1) const获取容器中指定范围的元素,返回一个新的 QVector 容器 void swap(QVector<T> &other):交换两个 QVector 容器的内容 -
迭代器:
API 接口 功能访问 iterator begin()返回容器的起始迭代器 const_iterator begin() const返回容器的只读起始迭代器 iterator end()返回容器的结束迭代器 const_iterator end() const返回容器的只读结束迭代器
1.3 简单示例代码
下面是一个简单的示例,介绍QVector的一些常用操作:
#include <QVector>
#include <QDebug>
int main()
{
// 创建一个 QVector 容器,并添加元素
QVector<int> vec;
vec.append(3);
vec.append(1);
vec.append(4);
vec.append(2);
qDebug() << "Original QVector:";
for (int i = 0; i < vec.size(); ++i) {
qDebug() << vec.at(i);
}
// 使用排序功能
vec.sort(Qt::AscendingOrder);
qDebug() << "Sorted QVector:";
for (int i = 0; i < vec.size(); ++i) {
qDebug() << vec.at(i);
}
// 插入元素
vec.insert(1, 8); // 在索引 1 位置插入值 8
qDebug() << "QVector after inserting 8 at index 1:";
for (int i = 0; i < vec.size(); ++i) {
qDebug() << vec.at(i);
}
// 删除元素
vec.remove(2); // 删除索引 2 处的元素
qDebug() << "QVector after removing the element at index 2:";
for (int i = 0; i < vec.size(); ++i) {
qDebug() << vec.at(i);
}
// 查找元素
int index = vec.indexOf(4);
if (index != -1) {
qDebug() << "Element 4 found at index:" << index;
} else {
qDebug() << "Element 4 not found";
}
return 0;
}
在这个示例中,我们展示了如何创建 QVector 容器、添加元素、排序、插入元素、删除元素以及查找元素。根据实际需求,您可以使用 QVector 提供的其他接口进行更多操作。

浙公网安备 33010602011771号