Qt常用容器之:QVector

参考原文:https://www.cnblogs.com/ybqjymy/p/17996789

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

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

  在这篇文章中,我们将深入探讨 QVector 的重要性和用法,包括基本操作、性能分析以及与其他容器的对比。我们的目标是帮助读者充分了解 QVector 的优势和局限性,从而在实际项目中做出明智的选择。无论您是 Qt 的新手还是经验丰富的开发者,相信这篇文章都能为您带来一些有用的见解。现在就让我们开始这段探索之旅吧!

QVector的常用接口

  QVector 是 Qt 框架中一个用于存储数据的容器类,它可以存储各种类型的数据,如整数、浮点数、自定义类等。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 的常用接口的详细介绍。使用 QVector 时,您可以根据实际需求选择合适的接口进行数据存储和操作。

  下面是一个简单的示例,介绍了 QVector 的一些常用操作:

 1 #include <QVector>
 2 #include <QDebug>
 3 
 4 int main()
 5 {
 6     // 创建一个 QVector 容器,并添加元素
 7     QVector<int> vec;
 8     vec.append(3);
 9     vec.append(1);
10     vec.append(4);
11     vec.append(2);
12 
13     qDebug() << "Original QVector:";
14     for (int i = 0; i < vec.size(); ++i) {
15         qDebug() << vec.at(i);
16     }
17 
18     // 使用排序功能
19     vec.sort(Qt::AscendingOrder);
20     qDebug() << "Sorted QVector:";
21     for (int i = 0; i < vec.size(); ++i) {
22         qDebug() << vec.at(i);
23     }
24 
25     // 插入元素
26     vec.insert(1, 8); // 在索引 1 位置插入值 8
27     qDebug() << "QVector after inserting 8 at index 1:";
28     for (int i = 0; i < vec.size(); ++i) {
29         qDebug() << vec.at(i);
30     }
31 
32     // 删除元素
33     vec.remove(2); // 删除索引 2 处的元素
34     qDebug() << "QVector after removing the element at index 2:";
35     for (int i = 0; i < vec.size(); ++i) {
36         qDebug() << vec.at(i);
37     }
38 
39     // 查找元素
40     int index = vec.indexOf(4);
41     if (index != -1) {
42         qDebug() << "Element 4 found at index:" << index;
43     } else {
44         qDebug() << "Element 4 not found";
45     }
46 
47     return 0;
48 }

在这个示例中,我们展示了如何创建 QVector 容器、添加元素、排序、插入元素、删除元素以及查找元素。根据实际需求,您可以使用 QVector 提供的其他接口进行更多操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/499105.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

哪些开放式耳机平价又好用的?五款超平价品牌推荐深度测评分享!

在当今快节奏的生活中&#xff0c;高品质的音频设备已成为放松身心的重要途径之一。开放式耳机&#xff0c;凭借其出色的音频表现和舒适的佩戴体验&#xff0c;正逐渐成为音乐爱好者的新选择。它们特有的开放设计不仅减轻了耳罩带来的压迫感&#xff0c;还使得用户仿佛置身于音…

四种常用限流算法、固定窗口限流算法、滑动窗口限流算法、漏桶限流算法和令牌桶限流算法

什么是限流&#xff1f; 限流可以被视为服务降级的一种形式&#xff0c;其核心目标是通过控制输入和输出流量来保护系统。通常&#xff0c;一个系统的处理能力是可以预估的&#xff0c;为了确保系统的稳定运行&#xff0c;当流量达到预定的阈值时&#xff0c;必须采取措施限制进…

vue中使用jsmind生成脑图

项目部分参数&#xff1a; vue&#xff1a;2.6.10 node:16.20.0 1、使用命令行安装jsmind&#xff1a; npm i jsmind -S 2、在文件中引入jsmind&#xff0c;并编写渲染jsmind的代码&#xff1a;&#xff1a; <template><!-- jsmind容器 --><divid"jsmi…

C#_泛型_委托

文章目录 泛型泛型的使用泛型的约束委托委托的实例化多播委托委托的调用内置委托类型委托练习泛型委托Lambda表达式(进阶)上期习题答案本期习题 泛型 泛型&#xff08;Generic&#xff09; 是一种规范&#xff0c;它允许我们使用占位符来定义类和方法&#xff0c;编译器会在编…

VLAN实验记录---对抗遗忘

sw1的接口6应该调成混杂模式&#xff0c;因为pc2,4,5,6的pvid各不相同而网段相同&#xff0c;所以往上去路由时应该剥离标记&#xff08;VLAN里面是标记而不是标签&#xff09;出去&#xff0c;这样 路由器上的物理接口用来管理不带标记的流量&#xff0c;而vlan2流量的往上打上…

git的使用日常习惯规范与一些特殊操作

git的使用日常习惯规范与一些特殊操作 操作习惯规范创建本地新分支&#xff0c;推送新分支到云端仓库1.创建一个本地的login分支2.创建新分支后切换到新分支3.推送新分支到云端 git的特殊操作撤回commit&#xff08;取消提交到本地版本库的动作&#xff0c;本地工作区写的代码不…

【LVGL-字库应用】

LVGL-中文字库应用 ■ LVGL-内部字库■ LVGL 内部字库的使用流程&#xff1a; ■ LVGL-自定义字库■ 方法一&#xff1a;C 语言数组&#xff08;内部读取&#xff09;-在线转换工具■ 方法二&#xff1a;C 语言数组&#xff08;内部读取&#xff09;-利用离线字体转换软件&…

Java学习记录第十三天

面向对象编程 核心思想就是OOP&#xff08;面向对象编程&#xff09; 面向过程&面向对象 面向过程思想 步骤清晰简单&#xff0c;第一步做什么&#xff0c;第二步做什么... 面对过程适合处理一些较为简单的问题 面向对象思想 物以类聚&#xff0c;分类的思维模式&…

香港服务器与SEO的关系(香港服务器对SEO影响大吗?)

香港服务器与 SEO 的关系是一个备受关注的话题&#xff0c;不少站长在选择了香港服务器后&#xff0c;便会疑问&#xff1a;香港服务器对SEO的影响是否显著?那么&#xff0c;在这里就跟大家聊聊两者的关系以及影响大小。 其实&#xff0c;不少站长对 SEO 的这种担忧和想法是片…

国内IP代理软件电脑版:深入解析与应用指南

随着互联网技术的快速发展&#xff0c;网络活动日益丰富多样&#xff0c;IP代理软件也因其独特的功能和优势&#xff0c;成为许多电脑用户不可或缺的工具。在国内&#xff0c;由于网络环境的复杂性和特殊性&#xff0c;选择一款稳定、高效的IP代理软件电脑版尤为重要。虎观代理…

Can‘t connect to MySQL server on ‘localhost‘ (10061)

问题展示&#xff1a;在安装sqlyog并连接本地数据库的时候出现该问题 问题分析&#xff1a;没有启动mysql服务

FLV流媒体封装格式

1、FLV 简介 FLV(Flash Video) 是 Adobe 公司推出的一种流媒体格式&#xff0c;由于其封装后的音视频文件体积小、封装简单等特点&#xff0c;非常适合于互联网上使用。目前主流的视频网站基本都支持FLV。采用 FLV 格式封装的文件后缀为.flv。直播场景下拉流比较常见的是 http-…

无人车网关案例:记SV900无人清扫车网关的现场应用

​随着无人驾驶技术的不断发展,无人车辆已经开始广泛应用于物流配送、环境保洁、巡逻监控等众多领域,助力城市运营更加高效智能。而要实现无人车辆的安全可靠运行,关键在于选择一款性能卓越的车载网络通信系统.在这一背景下,星创易联推出了SV900无人车网关系列产品。它集5G/4G网…

kubernetes(K8S)学习(九):K8S之日志监控

K8S之日志监控 一、Log and Monitor1.1 Log1.1.1 容器级别1.1.2 Pod级别1.1.3 组件服务级别1.1.4 LogPilot ES Kibana 1.2 Monitor1.2.1 Prometheus简介1.2.2 Prometheus架构1.2.3 Prometheus知识普及1.2.4 数据采集1.2.5 Prometheus Grafana 二、Trouble Shooting&#xff…

重生奇迹mu 弓箭手有什么技能

1、弓箭手职业技能&#xff1a;多重箭&#xff1a;同时射出三发弓箭&#xff0c;给予复数敌人伤害&#xff0c;根据弓的不同&#xff0c;射出的数量也不同。天堂之箭&#xff1a;弓箭垂直射向天际&#xff0c;准确的落在敌人的头顶上&#xff0c;造成严重的伤害。 2、重生奇迹…

【Unity】TextMeshPro富文本

启用富文本 在Unity里&#xff0c;如果需要使用富文本&#xff0c;首先需要开启Rich Text 如果不开启Rich Text&#xff0c;就会在UI上显示富文本代码 1.粗体 <b>Game</b> Over2.斜体 <i>Game</i> Over3.下划线 <u>Game</u> Over4…

ctfshow靶场sql注入wp

目录 web171 web172 web173 web174 web175 web176 web177-179 web180-183 web184 web185 web187 web190 web191 web192 web193 web194 web195 web196 web197 web199 web201 web202 web203 web204 web205 web206 web207 web208 web209 web210 web…

14 Games101 - 笔记 - 光线追踪(利用包围盒技术加速光线追踪(KD-Tree and BVH)

14 光线追踪&#xff08;利用包围盒技术加速光线追踪&#xff08;KD-Tree and BVH&#xff09; 在上一节中&#xff0c;我们介绍了whited-style光线追踪的原理&#xff0c;以及实现细节。相比与光栅化中所使用的的Blinn-Phong模型&#xff0c;光线追踪显著了提升了图像质量&am…

uniapp实现的数据选择器,支持H5、微信小程序

采用uniapp-vue3实现的数据选择器&#xff0c;支持H5、微信小程序&#xff08;其他小程序未测试过&#xff0c;可自行尝试&#xff09; 支持本地自定义过滤、远程接口过滤&#xff0c;为了避免弹窗面板超出边界的情况&#xff0c;自动计算弹窗面板安置的位置&#xff08;在微信…

Java八股文(设计模式)

Java八股文の设计模式 设计模式 设计模式 什么是设计模式&#xff1f;请列举一些常见的设计模式。 设计模式是软件设计中常用的一种思维模式&#xff0c;它描述了一类具有相似特征和解决思路的问题。 常见的设计模式包括单例模式、工厂模式、观察者模式、装饰器模式等。 请解释…
最新文章