QVector 与 QList

2024-01-08

我有一个需要迭代的整数列表,但数组是不够的。 两者有什么区别vectors and lists在选择类型之前我需要了解什么吗?

需要明确的是,我已阅读 QT 文档,但这是我所知道的范围:

QList<T>, QLinkedList<T>, and QVector<T>提供类似的功能。概述如下:

  • 对于大多数目的来说,QList是正确使用的类。它基于索引的API比QLinkedList's基于迭代器的 API,它通常比QVector因为它在内存中存储项目的方式。它还可以扩展到可执行文件中更少的代码。
  • 如果您需要一个真正的链表,并保证在列表中间插入恒定时间以及对项目而不是索引的迭代器,请使用QLinkedList.
  • 如果您希望项目占据相邻的内存位置,请使用QVector.

QVector大部分类似于std::vector,正如您可能从名称中猜到的那样。QList更接近于boost::ptr_deque,尽管有明显的关联std::list。它不直接存储对象,而是存储指向它们的指针。您可以获得两端快速插入的所有好处,并且重新分配涉及混洗指针而不是复制构造函数,但会失去实际的空间局部性std::deque or std::vector,并获得大量堆分配。它确实有一些决策来避免小对象的堆分配,重新获得空间局部性,但据我了解,它仅适用于小于int.

QLinkedList类似于std::list,并且具有它的所有缺点。一般来说,这应该是您最后选择的容器。

QT 库非常倾向于使用QList对象,因此在您自己的代码中使用它们有时可以避免一些不必要的单调乏味。理论上,在某些情况下,额外的堆使用和实际数据的随机定位可能会造成损害,但通常是不易察觉的。所以我建议使用QList直到分析建议更改为QVector。如果您期望连续分配很重要[阅读:您正在与期望连续分配的代码进行交互T[]代替QList<T>] 这也可以是一个开始的理由QVector马上。


如果你问的是一般的容器,并且只是使用QT文档作为参考,那么上面的信息就没那么有用了。

An std::vector是一个可以调整大小的数组。所有元素都彼此相邻存储,您可以快速访问各个元素。缺点是插入仅在一端有效。如果您将某些内容放在中间或开头,则必须复制其他对象以腾出空间。在big-oh表示法中,在末尾插入是O(1),在其他地方插入是O(N),随机访问是O(1)。

An std::deque类似,但不保证对象彼此相邻存储,并且允许在两端插入的时间复杂度为 O(1)。它还需要一次分配较小的内存块,这有时很重要。随机访问是 O(1),中间插入是 O(N),与vector。空间局部性比std::vector,但对象往往会聚集在一起,因此您可以获得一些好处。

An std::list是一个链表。它需要三个标准顺序容器中最多的内存开销,但可以在任何地方快速插入......前提是您事先知道需要插入的位置。它不提供对单个元素的随机访问,因此您必须以 O(N) 进行迭代。但一旦到达那里,实际插入的时间复杂度为 O(1)。最大的好处是std::list是你可以快速将它们拼接在一起......如果你将整个范围的值移动到不同的std::list,整个操作是O(1)。使列表中的引用无效也更加困难,这有时很重要。

一般来说,我更喜欢std::deque to std::vector,除非我需要能够将数据传递到需要原始数组的库。std::vector保证连续,所以&v[0]为此目的而工作。我不记得上次使用是什么时候std::list,但这几乎可以肯定是因为我需要更有力的保证参考文献仍然有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QVector 与 QList 的相关文章

  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • unshare() 和 copy() 有什么区别?

    Both unshare and copy 用于复制数组 但我看不出有什么区别 Unshare 正如它所说苹果文档 https developer apple com library prerelease ios documentation
  • 使用 css 在图像背景上产生波浪效果

    我想在视差背景图像上制作波浪效果 到目前为止 我有视差效果和全宽度 超过父容器宽度 section parallax width 100vw position relative margin left 50vw left 50 backgr
  • 如何等待来自 golang wasm 的 js 异步函数?

    我写了一个小函数await为了处理 go 中的异步 javascript 函数 func await awaitable js Value ret js Value ok bool if awaitable Type js TypeObje
  • CUDA调试:“目标位置没有值”,我明确设置了一个值

    我收到一个非常令人沮丧的错误 其中我的代码中的变量 没有值 这是我的代码的图片 底部有调试器信息 我的原始代码只有红色方块 但我在蓝色方块中添加了 Xmax 40 只是为了看看我是否可以强制将一个值放入变量中 显然你可以看到仍然有一个问题
  • PyKafka Producer.get_delivery_report 当 block=false 时抛出 Queue.empty

    我目前正在使用 Python 进行 Kafka 集成 并且我是来自 PHP 背景的 Kafka 和 Python 新手 我已经设法让生产者工作 但由于等待来自 Kafka 的确认 它处理每条消息的速度不够快 在 GitHub 页面上 htt
  • 如何删除字符串中的重复字母[重复]

    这个问题在这里已经有答案了 有没有办法删除重复的字符 例如 如果我们输入 hello 则输出将为 helo 另一个例子是 overflow 输出将是 overflw 另一个例子 paragraphs 输出将是 parghs 我努力了 def
  • firebase如何与node js离线工作?

    我对 NodeJS 有点陌生 正在使用 Fire Base 应用程序 我想制作一个应用程序 使其也可以与 Fire Base 离线配合使用 我试图寻找相关的答案我们究竟如何进行更改 以便 fire base 可以与 Nodejs 技术离线工
  • 如何查看 UWP 应用程序运行时的(大致)内存使用情况

    根据这篇文章使用 Visual Studio 中的新内存使用工具诊断内存问题 https blogs msdn microsoft com visualstudioalm 2014 04 02 diagnosing memory issue
  • 我的模板类中是否可以有一个静态成员变量,而该类的用户不必知道它?

    我有一个模板化容器类 类似于这个玩具代码 template
  • 使用res中的文件在libgdx android中加载纹理?

    在 LibGdx 中 纹理图像存储在 asset 文件夹中并使用以下代码加载 Texture texture new Texture Gdx files internal image someImage jpg 我对不同的屏幕分辨率有不同的
  • Eclipse 崩溃,ieframe.dll

    我正在将 Tizen IDE 用于可穿戴设备 在选择新的空工作区后它崩溃了 有什么想法吗 我有最新的 Internet Explorer A fatal error has been detected by the Java Runtime
  • 为什么我应该在评论表单中使用 BBCode 而不是 HTML?

    我正在用 PHP 编写一个评论解析函数 由于 BBCode 不是真正的标记语言 所以我从来不喜欢它的写作风格 因此 我让访问者能够在评论表单中使用基本的 HTML 代码 在发布时 PHP 将检查不允许的和无效的标签 属性 并替换或删除它们
  • 由于不活动而导致会话超时[重复]

    这个问题在这里已经有答案了 我创建了一个脚本login php我在那里创建了一个名为的会话变量logged in SESSION logged in true 由于不活动 会话过期后 我无法找到一种重定向到我的 logout php 的方法
  • 是否可以在 qmake 中向 Makefile 添加依赖项?

    目前 我有一个文件 其中包含一些版本标记信息 该信息由 pro 文件使用并由 qmake 解析 但问题是当该文件更改时 qmake 不会重新运行 是否可以向 pro 文件添加一些内容 以便 qmake 将该文件视为 Makefile 的依赖
  • 如何在表单中使用 RecId 作为外键

    我有一个项目表 每个项目都引用另一个表中的另一个项目 我们会说这些项目是人 而相关的项目是最喜欢的食物 表 A 鲍勃 1 莎莉 1 苏 3 表 B 1 苹果 2 香蕉 3 橙子 人 通过 People 表中引用的食物 RecId 与他们最喜
  • 修改响应体改造2.2拦截器

    我正在开发一个使用 Retrofit 2 来请求 API 的应用程序 该API位于ASP NET中 使用GZip进行压缩并编码为Base64 如下代码所示 private static string Compress string cont
  • 当使用 Node 的 fs.readFile() 时,我应该在路径前面加上 __dirname 吗?

    Example fs readFile path join dirname path to file callback versus fs readFile path to file callback 两者似乎都有效 所以我想知道我是否可以
  • CodeIgniter 会话帮助,cookie 不安全?

    我刚刚开始学习会话 出于我的目的 我想创建一些东西 根据客户端的每个请求 服务器验证该用户 然后才为该用户执行数据处理 然而 我见过很多 CodeIgniter 的例子 其中会话的设置如下 this gt load gt library s
  • 通过附加功能和屏幕旋转

    此类问题会定期出现 抱歉 如果之前已经介绍过这个问题 但我是新手 找不到合适的答案 它涉及班级和活动之间沟通的正确实施 我制作了一个画廊应用程序 它有 3 个主要活动 Main一 使用模式搜索文件名 AThumb一 在网格视图中显示与模式匹
  • QVector 与 QList

    我有一个需要迭代的整数列表 但数组是不够的 两者有什么区别vectors and lists在选择类型之前我需要了解什么吗 需要明确的是 我已阅读 QT 文档 但这是我所知道的范围 QList