擦除-删除习惯用法的性能增益来自哪里

2024-05-16

我需要从向量中删除满足特定条件的所有元素。

我的第一种方法是循环遍历向量并对满足条件的所有元素调用 vector::erase 。

据我所理解,vector::erase对于这个用例来说,性能很差,因为它从底层数组中删除了该项目,并将向量的其余部分向前移动一个元素(如果删除一系列元素,则移动更多元素)。 当您移除多个元素时,后面的元素将在每次移除时移动。

The remove算法获取所有要删除的元素,并将它们移动到向量的末尾,因此您只需删除向量的后部部分,这不涉及移位。

但为什么这比擦除更快呢?(是不是更快了?)

将元素移动到末尾并不意味着将所有以下元素向前移动,如vector::erase?

为什么删除的复杂度只有 O(n)?


这里的性能问题不是擦除要删除的元素,或者将它们移动到末尾(这实际上不会发生),而是关于移动要保留的元素.

如果你使用erase在要删除的每个元素上,您需要移动这些元素之后的所有元素...对于每次调用erase。通常,如果您想删除k元素,您将移动最新元素之后的元素(在向量中)k多次而不是一次。

但如果你打电话remove,您只能移动这些一次(参见下面的示例)。

一个小例子可以更好地理解这两种方法的工作原理:

假设您有一个大小为 1000 的向量,并且要删除的元素位于位置 17 和 37。

With erase作用于要删除的两个元素:

  • 你打电话时erase()对于第 17 个元素,您需要将元素 18 移动到 999、982 个元素。
  • 你打电话时erase()对于第 36 个元素(现在是第 36 个!),您需要将元素 37 移动到 998、962 个元素。

总共,您移动了 962 + 982 = 1944 个元素,其中 962 个元素被无故移动了两次。

With remove,发生的情况如下:

element 0 does not change;
element 1 does not change;
...
element 17 is "discarded";
element 18 is moved at position 17;
element 19 is moved at position 18;
...
element 36 is moved at position 35;
element 37 is "discarded";
element 38 is moved at position 36;
...
element 999 is moved at position 997.

总共,您移动了 998 个元素(1000 减去您删除的两个),这比之前方法的 1943 个元素要好得多。如果要删除的元素超过 2 个,则效果更好。

你可以看看可能的实施 http://en.cppreference.com/w/cpp/algorithm/remove访问 en.cppreference.com 以更好地了解如何std::remove works.

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

擦除-删除习惯用法的性能增益来自哪里 的相关文章

  • 何时使用模拟框架?

    因此 我正在使用模拟框架 Moq 进行单元测试 并且想知道何时应该使用模拟框架 以下两个测试之间的优点 缺点是什么 public class Tests Fact public void TestWithMock Arrange var r
  • STL Map 或 HashMap 线程安全吗?

    我可以在多线程程序中使用映射或哈希图而不需要锁吗 即它们是线程安全的吗 我想同时在地图中添加和删除 那里似乎有很多相互矛盾的信息 顺便说一下 我在Ubuntu 10 04下使用的是GCC自带的STL库 编辑 就像互联网的其他部分一样 我似乎
  • ASP.net C#,采用不同参数类型的同名方法[重复]

    这个问题在这里已经有答案了 可能的重复 可以在 ASP Net MVC 中重载控制器方法吗 https stackoverflow com questions 436866 can you overload controller metho
  • C# 返回一个数的倍数和余数?

    我想找到给定数字的 3 的所有倍数 并找到余数 例如 给定数字 10 3 的倍数 3 6 9 余数 1 给定数字 11 3 的倍数 3 6 9 余数 2 到目前为止我的算法 但不是代码 是这样的 检查 X 是否是 3 的倍数 是 返回倍数
  • 忽略 Entity Framework 6 中除部分属性外的所有属性

    我想使用实体框架在数据库中保留一些数据 我有一些更大的 POCO 但我只想存储一些属性 我知道我可以通过Fluent API通过使用Ignore 方法 但是是否也有可能不仅忽略已定义的属性 而且还忽略除已定义属性之外的所有属性 所以如果你有
  • 不能从模板 C++ 类继承[重复]

    这个问题在这里已经有答案了 我不知道这里出了什么问题 也许有人可以帮助我 我想继承我的新班级MyDictionary来自模板抽象类dictionary 我有这样的代码 字典 h ifndef UNTITLED CPP DICTIONARY
  • 为什么 -1 >> 1 和 0xFFFFFFFF >> 1 会产生不同的结果?

    我正在尝试做一个测试来判断我的电脑是否通过右移十六进制执行算术右移或逻辑右移FFFFFFFF by 1 我知道一个整数 1读作FFFFFFFF十六进制 因为它是二进制补码1 右移 1 by 1结果是FFFFFFFF并显示 PC 执行算术右移
  • 如何在运行时添加到 TreeView 目录

    我有一个TreeView我想允许用户添加和删除子项目 在探索基本功能时 我使用button and a textbox添加此子项 当用户点击button a new TreeViewItem需要创建并设置为我的父项的子项TreeView与t
  • 确定 C 字符串是否是 C 中的有效 int

    我需要检查 C 字符串是否是有效整数 我都尝试过 int num atoi str and int res sscanf str d num 但发送字符串 8 9 10 这两行都仅返回 8 而没有指示该字符串的无效性 谁能提出替代方案 看看
  • 未捕获 Func<> 的异常(异步)

    我有以下代码 为了进行此重现而进行了简化 显然 catch 异常块将包含更多逻辑 我有以下代码 void Main var result ExecuteAction async gt Will contain real async code
  • 未解决的包含:。为什么?

    在运行一个简单的 c 程序时 我收到一个 Unresolved inclusion
  • 无法将 MVC 4 部署到服务器

    我的 Web 应用程序只是一个用 VS 2010 MVC 4 制作的简单 Web 应用程序 没有任何外部代码 它只是 VS 2010 的默认应用程序 我有 Plesk 的豪华 Windows 托管 我从未更改过帐户中的任何功能 我将所有文件
  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template

随机推荐

  • PHP:在多维数组中查找相同的键并合并结果

    我有一个多维数组 如下所示 array 0 gt array WS gt array id gt 2 name gt hello 1 gt array SS gt array id gt 1 name gt hello2 2 gt arra
  • 页面上首次调用 Url.Action 速度很慢

    我有一个相当简单的 ASP MVC 视图的性能问题 这是一个登录页面 应该几乎是即时的 但需要大约半秒钟 经过大量挖掘后 问题似乎出在第一个调用上Url Action 大约需要 450 毫秒 根据迷你分析器 http miniprofile
  • 我应该如何审核 MySQL 表中的更改(使用 MySQL 4)?

    我被要求审核 MySQL 表中的任何 所有更改 有谁知道有什么工具可以帮助我做到这一点 还是我需要编写自己的解决方案 如果我编写自己的审计 我最初的想法是制作一个单独的表并在 PHP 代码中构建一系列更改 类似 fieldname1 gt
  • 两个 RichTextBox 具有相同的滚动条

    是否有任何可用的第三方工具有两个富文本框 但两者只有一个共享滚动条 我需要用两种不同的语言实现一些文本 但两个文本框应该同时滚动 public enum ScrollBarType uint SbHorz 0 SbVert 1 SbCtl
  • 可视化 TFLite 图并获取特定节点的中间值?

    我想知道是否有办法知道 tflite 中特定节点的输入和输出列表 我知道我可以获得输入 输出详细信息 但这不允许我重建发生在Interpreter 所以我要做的是 interpreter tf lite Interpreter model
  • asp.net web api 自托管/owin/katana

    我对自托管有多个问题 自托管 Nuget 有 2 个 nuget 提供自托管 Microsoft AspNet WebApi OwinSelfHost and Microsoft AspNet WebApi SelfHost 那么微软有2种
  • 在 64 位操作系统上以 32 位运行 IIS 与以 64 位运行 IIS 有何优缺点?

    可能更适合 机架溢出 但从开发人员的角度来看 在 64 位 Windows 主机上将 IIS 同时服务于传统经典 ASP 和 NET 作为 32 位进程而不是 64 位进程运行有哪些优点和缺点 32 64 iis 服务器 相对于 32 32
  • 使用 cmake 处理头文件依赖关系

    我正在一个小型 C 项目上使用 CMake 到目前为止 它运行得很好 有一点点 x 当我更改头文件时 通常需要重新编译许多源文件 直接或间接包含它的文件 但是 cmake 似乎只检测到some的源文件被重新编译 导致损坏状态 我可以通过清除
  • 在循环中使用 NUnit Assert 时,如何在错误消息中显示更多信息?

    考虑以下代码 Test public void WidgetTest foreach Widget widget in widgets Assert AreEqual 0 widget SomeValue 如果其中一个断言失败 我将收到一条
  • Android 布局不需要的填充

    所以我有这个布局文件 如下 正如您所看到的 没有填充或边距 dimen xml 文件也没有任何填充 边距 最后 我根本不以编程方式更改布局
  • 在具有不同边框的 div 上调用函数

    我有一个div对于一个名为 ball 的类 div 的每个边缘都有一个边框 顶部边框 左侧边框等 当用户单击每个边框上的边框时 我想用 JavaScript 触发不同的事件 例如 用户点击边框顶部console log top 等等 HMT
  • 在shell命令行中创建mysql触发器

    我需要在命令行中创建一个mysql触发器 这个sql在mysql控制台中运行良好 sql USE DB1 DROP TRIGGER IF EXISTS my trigger DELIMITER CREATE TRIGGER my trigg
  • Django 2.0 haystack 更新索引,重建索引抛出错误

    我使用 django 2 0 和 haystack whoosh 作为搜索 我按照文档中的说明进行配置 发生的问题是当我跑步时 manage py rebuild index它显示此错误 Traceback most recent call
  • 多选复选框下拉

    我正在使用多选复选框下拉菜单 请看例子jsfiddle http jsfiddle net manthan11 qqhczbvs 6 function lstStates multiselect 选择州后 它会显示 TEXT 值并用逗号连接
  • PHP服务器端IAB验证openssl_verify总是返回0

    我使用以下函数 服务器端 php 来验证 IAB v3 事务 我从 Android 应用程序传递过来 Override protected void onActivityResult int requestCode int resultCo
  • 使用 jquery fullCalendar 时,为什么我在切换月份后看到重复的事件?

    I am 使用 jquery fullCalendar 插件 http arshaw com fullcalendar 我遇到了一个奇怪的问题 当我加载第一个月 在本例中为 2013 年 12 月 时 它工作正常 我调用我的 ajax 事件
  • AngularJS - RouteProvider 解析调用服务方法

    我创建了一项检查用户登录状态的服务 如果令牌存在 则登录用户 否则重定向到登录页面 最初我通过routeProvider解析调用了这个服务 这一次就可以完美工作 但是由于Angularjs服务是单例的 因此测试不会针对连续调用运行 然后 我
  • XHTML 和文本区域内的代码

    在我的一个使用文本区域进行提交的网站上 我的代码可以显示如下所示的内容
  • 如何从 Ruby 程序发送邮件?

    我想从 Ruby 应用程序发送电子邮件 核心语言中是否有调用来执行此操作 或者是否有我应该使用的库 最好的方法是什么 如果你不想使用行动邮递员 http wiki rubyonrails org rails pages ActionMail
  • 擦除-删除习惯用法的性能增益来自哪里

    我需要从向量中删除满足特定条件的所有元素 我的第一种方法是循环遍历向量并对满足条件的所有元素调用 vector erase 据我所理解 vector erase对于这个用例来说 性能很差 因为它从底层数组中删除了该项目 并将向量的其余部分向