通过迭代器与运算符[]/索引访问 std::vector 的速度?

2023-12-31

说吧,我有一个

std::vector<SomeClass *> v;

在我的代码中,我需要在程序中经常访问其元素,向前和向后循环它们。

这两者之间哪一种访问速度最快?

迭代器访问:

std::vector<SomeClass *> v;
std::vector<SomeClass *>::iterator i;
std::vector<SomeClass *>::reverse_iterator j;

// i loops forward, j loops backward
for( i = v.begin(), j = v.rbegin(); i != v.end() && j != v.rend(); i++, j++ ){
    // some operations on v items
}

下标访问(按索引)

std::vector<SomeClass *> v;
unsigned int i, j, size = v.size();

// i loops forward, j loops backward
for( i = 0, j = size - 1; i < size && j >= 0; i++, j-- ){
    // some operations on v items
}

而且, const_iterator 是否提供了一种更快的方法来访问向量元素,以防我不必修改它们?


性能差异可能可以忽略不计或没有(编译器可能会将它们优化为相同);您应该担心其他事情,例如您的程序是否正确(缓慢但正确的程序比快速但不正确的程序要好)。不过,使用迭代器还有其他优点,例如能够将底层容器更改为没有迭代器的容器。operator[]无需修改您的循环。看这个问题 https://stackoverflow.com/questions/2515527/use-of-iterators-over-array-indices了解更多。

与普通迭代器相比,const_iterators 很可能没有或可以忽略不计的性能差异。它们旨在通过防止修改不应该修改的内容来提高程序的正确性,而不是为了性能。这同样适用于const关键字一般。

简而言之,在发生以下两件事之前,优化不应该成为您关注的问题:1)您注意到它运行了太慢了 and 2) 您已经分析了瓶颈。对于 1),如果它的运行速度比实际速度慢十倍,但只运行一次并且花费 0.1 毫秒,谁在乎呢?对于2),确保它确实是瓶颈,否则优化它会几乎没有可测量的效果论性能!

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

通过迭代器与运算符[]/索引访问 std::vector 的速度? 的相关文章

  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum

随机推荐

  • Delphi 7:如何实现多线程?

    我在主窗体中有一个按钮 当用户点击该按钮时 将执行以下过程 begin Process done FALSE Process Result Clear cmdProcess CommandLine 34 AppPath getdata ex
  • Haskell Monad - 列表中的 Monad 如何工作?

    为了理解 Monad 我提出了以下定义 class Applicative f where purea a gt f a app f a gt b gt f a gt f b class Applicative m gt Monadd m
  • C++ 静态库可以链接到共享库吗?

    假设我有一个静态 C 库 static lib 并且我想从 C 共享库 例如 shared lib 调用一些函数 是否可以 现在假设我有另一个共享库 例如shared2 lib 它链接到static lib 但不链接到shared lib
  • 需要添加粘贴特殊条件a copy.destination for循环

    我有一系列数据在书中的每个工作表中处于相同位置 并且将始终处于该位置 运行宏时 应复制数据并将其添加到报告表中 我有那部分工作 但我需要使用特殊的粘贴 PasteSpecial xlPasteValues 因为范围内有公式 我不确定在这段代
  • 转发器中的动态下拉列表,ASP.NET

    基本上 我的代码来自这里 http ranafaisal wordpress com 2009 02 17 dynamically adding removing textboxes in aspnet repeater http rana
  • eclipse 不显示 Avd 管理器窗口和 android 项目

    我在用着Windows 7的 and 日食赫利俄斯 我成功安装了所有软件包并且可以运行avd在命令行上 但是Eclipse没有显示AVD管理器窗口和我的android项目 为什么 我知道这个答案有点晚了 但对于后代来说 这就是它的完成方式
  • 获取iOS今日扩展的宽度

    我想获取我的小部件 今天扩展的宽度值 我不能使用self view frame size width因为它返回整个屏幕宽度 而不是实际的小部件宽度 在 iPad 上 扩展的宽度不等于屏幕宽度 我该如何获取小部件的实际宽度 不要读取 self
  • 按字符串的一部分对字符串列表进行排序

    我有一个具有以下格式的字符串列表 variable1 name1 variable2 name2 variable3 name3 我想根据以下内容对列表进行排序 nameX 部分 按字母顺序排列 我该怎么做呢 要更改排序键 请使用the k
  • Compass CSS 框架 - 将 Bootstrap 与 SASS 结合使用

    我想将 Bootstrap 与 SASS 一起使用 但我找不到任何教程或解释如何将 Bootstrap 与 SASS 一起使用 我唯一发现的是通过红宝石宝石安装 指南针创建我的新项目 r bootstrap sass using boots
  • 如何异步加载 JSON (iOS)

    我的应用程序使用 JSON 解析来自 Rails 应用程序的信息 我正在寻找一种异步加载 JSON 的方法 但由于代码的复杂性 我无法让我的代码与我找到的示例一起使用 我需要做什么才能异步加载 JSON 谢谢 void viewDidLoa
  • MySQL - 我应该使用哪种哈希算法?

    我有一个包含 360000 个单词 条目 的大型韵律数据库 每个单词都有一个类别 例如 sheet 和 meet 都有类别 eet 在我的网站空间上 查找合适韵律的查询有点慢 因此我想通过将类别加密为仅包含数字的哈希来加快速度 我听说这样更
  • 创建 PostgreSQL 函数时使用 Array_append 给我语法错误

    这是代码 CREATE OR REPLACE FUNCTION primes IN integer RETURNS TEXT AS DECLARE counter INTEGER 1 primes int mycount int BEGIN
  • 将 C++ lambda 传递给旧的 C 函数指针

    我必须为旧的 C 库创建一个 C 包装器 在类方法中 我必须调用一个 c 函数 该函数还需要一个函数指针 它是一个事件处理程序 并且该函数需要一个在事件发生时触发的函数 一个简单的例子是这样的 void myclass add handle
  • 堆转储大小与 hprof 大小

    最近 当我的 jboss 服务器运行 xms 为 4096m xmx 为 4096m permsize 为 512m 时 我以 hprof 格式进行了堆转储 生成的hprof文件超过5GB 当我在 VisualVM Mat 分析器或 you
  • 如何使用回形针裁剪然后调整大小

    我有一个照片附件 正在使用回形针保存 但是 我想在保存之前先处理照片 方法是裁剪照片 然后调整大小到最终尺寸 例如我有一张 900x900 的照片 我想首先将中央裁剪为 500x500 然后将裁剪后的照片调整为缩略图大小 100x100 这
  • 使用单元格中的值作为公式中的单元格引用?

    我想知道如何从另一个单元格的值中提取单元格引用并将其插入公式中 举个简单的例子 在单元格 A1 中我有这个 COUNT B4 H4 我不想在设置公式时选择范围 而是希望该范围是动态的 基于其他单元格中的值 所以 我想输入单元格引用 cell
  • python manage.py runserver 不显示任何内容

    我曾经使用 django 工作 过去没有遇到这个问题 然后我转移了一段时间到 Laravel 当然我在 Windows 中改变了很多我不记得的东西 现在当我击中python manage py runserver 什么也没发生 外壳看起来就
  • 如何在应用程序一开始就破坏堆栈

    堆栈帧指针 EBP 应始终指向前一个堆栈帧正确的位置 但为什么我的应用程序中不是这样 这表明确实有问题 很难相信 我创建了多个简单的演示应用程序 其中堆栈指针始终指向前一个堆栈帧 但我无法理解为什么此应用程序中不是这种情况 而是在我的应用程
  • Formik - 类型错误:无法读取未定义的属性“类型”?

    我几乎刚刚从这里复制粘贴此代码 https codesandbox io s formik checkbox example 96miz from embed function Checkbox props return
  • 通过迭代器与运算符[]/索引访问 std::vector 的速度?

    说吧 我有一个 std vector