当前位置: 首页 > news >正文

QT - Qvector用法

QVector 是 Qt 框架中提供的一个模板类,用于动态数组的操作。它与标准库中的 std::vector 类似,但更适合在 Qt 应用中使用。 QVector 提供了多种功能,便于管理和操作动态数组。下面将详细介绍 QVector 的各项功能,并给出示例代码。

创建和初始化

可以通过不同的方式创建和初始化 QVector。

QVector 是 Qt 框架中提供的一个模板类,用于存储和操作动态数组。下面将详细介绍 QVector 的各种创建和初始化方法,并给出相关的知识点。

默认构造函数

创建一个空的 QVector。

QVector<int>    vec1;

指定大小的构造函数

创建一个指定大小的QVector,所有元素都初始化为默认值。

QVector<int>      vec2(10);      // 创建一个大小为10QVector,所有元素初始化为0

指定大小和初始值的构造函数

创建一个指定大小并指定初始值的 QVector。

QVector<int>      vec3(10, 5);        //创建一个大小为10QVector,所有元素初始化为5

使用 std::initializer_list 初始化

使用初始化列表来创建并初始化 QVector。

QVector<int>    vec4 = {1, 2, 3, 4, 5};

拷贝构造函数

使用另一个 QVector 初始化。

QVector<int>     vec5(vec4);                     // 使用 vec4 初始化 vec5

从指针和大小初始化

使用指针和大小初始化 QVector。

int array[] = {1, 2, 3, 4, 5};

QVector<int>     vec6(array, array + 5);      // 使用 C++ 数组初始化 QVector

使用 std::vector 初始化

将 std::vector 转换为 QVector。

std::vector<int>         stdVec = {1, 2, 3, 4, 5};

QVector<int>            vec7 = QVector<int>::fromStdVector(stdVec);

使用 QList 初始化

将 QList 转换为 QVector。

QList<int>         list = {1, 2, 3, 4, 5};

QVector<int>    vec8 = QVector<int>::fromList(list);

使用 QVector 初始化 QList

将 QVector 转换为 QList。

QVector<int>    vec9 = {1, 2, 3, 4, 5};

QList<int>         list2 = vec9.toList();

使用 fill 方法初始化

使用 fill 方法将 QVector 中的所有元素设置为指定值。

QVector<int>      vec10(10);

vec10.fill(7);         // 将所有元素设置为7

通过 resize 方法调整大小并初始化

使用 resize 方法调整 QVector 的大小,新的元素会被默认值初始化。

QVector<int>          vec11;

vec11.resize(10);       // 调整大小为10,所有新元素初始化为0

通过 reserve 预留空间

预留空间不会改变 QVector 的大小,但会改变它的容量。

QVector<int>           vec12;

vec12.reserve(20);     // 预留20个元素的空间

元素访问

可以通过下标或迭代器访问 QVector 的元素。

#include <QVector>

#include <QDebug>

int main() {

    QVector<int>    vec = {1, 2, 3, 4, 5};

    // 下标访问

    qDebug() << "First element:" << vec[0];

    qDebug() << "Second element:" << vec.at(1);

    // 迭代器访问

    for (QVector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {

           qDebug() << *it;

    }

    // 常量迭代器访问

    for (QVector<int>::const_iterator it = vec.cbegin(); it != vec.cend(); ++it) {

          qDebug() << *it;

    }

    return 0;

}

添加和移除元素

可以使用多种方法在 QVector 中添加和移除元素。

#include <QVector>

#include <QDebug>

int main() {

    QVector<int>     vec;

    //添加元素

    vec.append(1);

    vec.append(2);

    vec.append(3);

    //在指定位置插入元素

    vec.insert(1, 10);                    //在索引1处插入10

    //移除元素

    vec.remove(2);                       //移除索引2处的元素

    vec.removeLast();                  //移除最后一个元素

    for (int value : vec) {              // 输出vec内容

          qDebug() << value;

    }

    return   0;

}

大小和容量

可以检查和调整 QVector 的大小和容量。

#include <QVector>

#include <QDebug>

int main() {

    QVector<int>     vec = {1, 2, 3, 4, 5};

    qDebug() << "Size:" << vec.size();                      //获取大小

    qDebug() << "Capacity:" << vec.capacity();        //获取容量

    vec.resize(10);                       //调整大小: 调整大小为10,新增元素初始化为0

    vec.reserve(20);                     //预留容量: 预留容量为20

    vec.squeeze();                       //缩减容量: 将容量调整为当前大小

    qDebug() << "New Size:" << vec.size();

    qDebug() << "New Capacity:" << vec.capacity();

    return   0;

}

查找和排序

常规排序

可以查找元素和对 QVector 进行排序。

#include <QVector>

#include <QDebug>

#include <algorithm>

int main() {

    QVector<int>    vec = {5, 3, 1, 4, 2};

    // 查找元素

    int   index = vec.indexOf(3);                // 查找值为3的元素的索引

    qDebug() << "Index of 3:" << index;

    // 排序

    std::sort(vec.begin(), vec.end());

    // 输出排序后的vec内容

    for (int value : vec) {

          qDebug() << value;

    }

    return 0;

}

QVector自定义结构排序

在 QVector 中存储自定义结构并对其进行排序,可以利用 qSort 或者 std::sort,需要为自定义结构定义合适的比较函数。下面是一个详细的示例,包括自定义结构的定义、初始化和排序。

  • 步骤:

1.定义自定义结构:  创建一个包含两个成员变量的自定义结构。

2. 实现比较函数:  定义一个比较函数,用于排序。

3. 创建并初始化 QVector:  创建一个 QVector 对象,并插入一些自定义结构的实例。

4. 排序 QVector:  使用 std::sort 或 qSort 对 QVector 进行排序。

代码示例:

#include <QCoreApplication>

#include <QVector>

#include <QDebug>

#include <algorithm>

// 1. 定义自定义结构

struct Person {

    QString name;

    int age;

    Person(const QString &n, int a) : name(n), age(a) { }

};

// 2. 实现比较函数

bool compareByAge(const Person &p1, const Person &p2) {

    return p1.age < p2.age;

}

int main(int argc, char *argv[])

{

    QCoreApplication   a(argc, argv);

    // 3. 创建并初始化 QVector

    QVector<Person> people;

    people.append(Person("Alice", 30));

    people.append(Person("Bob", 25));

    people.append(Person("Charlie", 35));

    people.append(Person("David", 20));

    qDebug() << "Before sorting:";

    for (const Person &p : people) {

        qDebug() << p.name << p.age;

    }

    // 4. 排序 QVector

    std::sort(people.begin(), people.end(), compareByAge);

    qDebug() << "After sorting by age:";

    for (const Person &p : people) {

        qDebug() << p.name << p.age;

    }

    return a.exec();

}

其他常用功能

还有一些其他常用功能,比如 clear、contains、count 等。

#include <QVector>

#include <QDebug>

int main() {

    QVector<int>  vec = {1, 2, 3, 4, 5};

    // 清空QVector

    vec.clear();

    // 检查是否包含某个值

    vec.append(1);

    vec.append(2);

    vec.append(3);

    bool contains = vec.contains(2);

    qDebug() << "Contains 2:" << contains;

    // 获取某个值的出现次数

    int count = vec.count(2);

    qDebug() << "Count of 2:" << count;

    return 0;

}

QVector 和 std::vector 的互操作

QVector 和 std::vector 可以互相转换。

#include <QVector>

#include <vector>

#include <QDebug>

int   main() {

    QVector<int>    vec = {1, 2, 3, 4, 5};

    // QVector 转换为 std::vector

    std::vector<int>   stdVec = vec.toStdVector();

    // std::vector 转换为 QVector

    QVector<int>    newVec = QVector<int>::fromStdVector(stdVec);

    // 输出 newVec 内容

    for (int value : newVec) {

        qDebug() << value;

    }

    return   0;

}

QVector的常用接口

构造函数:

QVector():创建一个空的 QVector 容器。

QVector(int size):创建一个指定大小的 QVector 容器。

QVector(int size, const T &value):创建一个指定大小的 QVector 容器,并用给定值填充。

QVector(const QVector<T> &other):复制构造函数,用另一个 QVector 容器创建一个新的 QVector 容器。

元素访问:

T &operator[](int i):通过索引访问元素,返回指定索引处的元素的引用。

const T &operator[](int i) const:以只读方式通过索引访问元素。

T &at(int i):通过索引访问元素,会检查索引是否越界。

T &front():返回容器中的第一个元素的引用。

const T &front() const:以只读方式返回容器中的第一个元素。

T &back():返回容器中的最后一个元素的引用。

const T &back() const:以只读方式返回容器中的最后一个元素。

容量和大小:

bool  isEmpty() const判断容器是否为空。

int     size() const获取容器中元素的数量。

int    capacity() const获取容器的容量。

void reserve(int size)预分配指定数量的元素空间,提高性能。

void squeeze()释放未使用的容量,将容量调整为实际元素数量。

修改容器:

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)移除容器中第一个等于给定值的元素。

查找:

int indexOf(const T &value, int from = 0) const:从指定位置开始查找给定值的元素,返回第一个找到的元素的索引。

int lastIndexOf(const T &value, int from = -1) const:从指定位置开始向前查找给定值的元素,返回第一个找到的元素的索引。

bool contains(const T &value) const:判断容器中是否包含给定值的元素。

int count(const T &value) const:计算容器中给定值的元素的个数。

排序:

void sort(Qt::SortOrder order = Qt::AscendingOrder):对容器中的元素进行排序,可以指定升序或降序。

void stableSort(Qt::SortOrder order = Qt::AscendingOrder):对容器中的元素进行稳定排序,可以指定升序或降序。

迭代器:

iterator begin():返回容器的起始迭代器。

const_iterator begin() const:返回容器的只读起始迭代器。

iterator end():返回容器的结束迭代器。

const_iterator end() const:返回容器的只读结束迭代器。

比较操作符:

bool operator==(const QVector<T> &other) const:判断两个 QVector 容器是否相等,元素数量和值都相等时为 true

bool operator!=(const QVector<T> &other) const:判断两个 QVector 容器是否不相等。

其他功能:

QVector<T> &operator=(const QVector<T> &other):赋值操作符,将一个 QVector 容器赋值给另一个。

QVector<T> mid(int pos, int length = -1) const:获取容器中指定范围的元素,返回一个新的 QVector 容器。

void swap(QVector<T> &other):交换两个 QVector 容器的内容。

总结

QVector 是 Qt 提供的一个功能强大的动态数组类,具备了动态数组所需的各种基本操作,包括添加、删除、访问和遍历元素,同时还提供了大小管理、排序和查找等高级功能。熟练掌握 QVector 可以极大地提高 Qt 开发的效率和代码质量。

http://www.dtcms.com/a/272004.html

相关文章:

  • Java设计模式之行为型模式(观察者模式)介绍与说明
  • 关于k8s Kubernetes的10个面试题
  • 【AXI】读重排序深度
  • Scala实现网页数据采集示例
  • linux的用户和权限(学习笔记
  • 西门子200SMART如何无线联三菱FX3U?御控工业网关实现多站点PLC无线通讯集中控制!
  • MiniGPT4源码拆解——models
  • 膨胀卷积介绍
  • QPC框架中状态机的设计优势和特殊之处
  • 大模型在膀胱癌诊疗全流程预测及应用研究报告
  • 【Linux基础命令使用】VIM编辑器的使用
  • 【个人笔记】负载均衡
  • Linux小白学习基础内容
  • LUMP+NFS架构的Discuz论坛部署
  • 可视化DIY小程序工具!开源拖拽式源码系统,自由搭建,完整的源代码包分享
  • Spring Boot 3.4 :@Fallback 注解 - 让微服务容错更简单
  • 分桶表的介绍和作用
  • OpenSearch 视频 RAG 实践
  • GO 启动 简单服务
  • 【YOLO脚本】yolo格式数据集删除缺失删除图片和标签
  • 青岛门卫事件后:高温晕厥救援技术突破
  • 文件系统----底层架构
  • 如何处理mocking is already registered in the current thread
  • IDEA 安装AI代码助手GitHub Copilot和简单使用体验
  • Apache http 强制 https
  • 百度文心ERNIE4.5部署与性能白皮书:FastDeploy加速方案+全系列模型实测数据对比
  • DVWA靶场通关笔记-弱会话IDs(Weak Session IDs Medium级别)
  • mmu 是什么?core和die是什么?
  • 计算机网络实验——无线局域网安全实验
  • UE 植物生长 Motion Design