Qt 技巧笔记(四)QVector 的底层原理与高级用法(一)

QVectorQt框架中的一个动态数组类,用于存储相同类型的元素。QVector内部使用连续内存存储元素。QVector内部使用连续内存存储元素,提供了随机访问、插入和删除等操作。以下是一些典型的QVector应用场景:

  1.随机访问:由于QVector内部使用连续内存存储元素,它提供了快速的随机访问能力。这使得QVector在需要频繁访问数据集中任意元素的场景下非常适用。
  2.动态数组:QVector可以根据需要自动调整大小,这使得它在处理不确定大小的数据集时非常有用。在需要动态调整数组大小的场景下,QVector比固定大小的数组更加灵活。
  3.高效的插入和删除:QVector在尾部插入和删除元素非常高效。这使得QVector在需要频繁添加或删除尾部元素的场景下非常合适。
  4.缓存和缓冲区:QVector可以用作缓存或缓冲区,用于存储从外部数据源(如文件、网络等)接收到的数据。这可以提高数据处理速度,避免频繁访问外部数据源。
  5.图形和数据可视化:在处理图形和数据可视化任务时,QVector可以用于存储点、颜色、纹理坐标等数据。它可以与Qt的绘图和数据可视化工具一起使用,如QPainterQCustomPlot

1.1 QVector 的重要性与简介

​ 在计算机编程的世界中,数据结构是一个核心概念,它为我们提供了有效组织和存储数据的方法。在众多数据结构中,向量(Vector)作为一种动态数组,因其灵活性和高效性受到广泛的关注。特别是在使用Qt框架进行C++编程时,QVector成为程序员的有利工具。

​ QVector是Qt容器类库中的一个重要组成部分,它提供了类似于C++标准库中的std::vector的功能,但同时拥有Qt独特的优势。QVector 是一个动态数组,可以容纳任意数量的元素,支持在末尾添加、插入和删除元素。与其他容器相比,QVector在随机访问元素时具有出色的性能,同时在尾部添加和删除元素时依能保持较高的效率。

1.2 QVector的常用方法接口

QVectorQt框架中一个用于存储数据的容器类,它可以存储各种类型的数据结构,如整数、浮点数、自定义类等。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 提供的其他接口进行更多操作。

参考资料:

Qt QVector 详解:从底层原理到高级用法 - 一杯清酒邀明月 - 博客园

QVector使用详解-CSDN博客

posted @ 2026-02-02 16:33  GeoFXR  阅读(0)  评论(0)    收藏  举报