如何从 std::list 实现 O(1) 擦除

2024-02-19

问题是推荐的使用方式是什么std::list实现 O(1) 删除列表项?

通常,当我选择双向链表时,我希望能够在 O(1) 时间内从列表中删除一个元素,然后在 O(1) 时间内将其移动到不同的列表。如果该元素有自己的prev and next指针,没有真正的技巧可以完成工作。如果列表是双向链接的循环列表,则删除不一定需要知道包含该项目的列表。

As per 迭代器失效规则 https://stackoverflow.com/q/6438086/315052, std::list迭代器非常耐用。所以,在我看来,使用时得到了我想要的行为std::list我自己的项目是在我的类中存储一个迭代器以及包含列表。

class Item {
    typedef std::shared_ptr<Item> Ptr;
    struct Ref {
        std::list<Ptr>::iterator iter_;
        std::list<Ptr> *list_;
    };
    Ref ref_;
    //...
};

这有一个缺点,我需要创建我自己的装饰版本std::list知道更新ref_每当该项目添加到列表中时。我想不出一种不需要嵌入式迭代器的方法,因为没有嵌入式迭代器意味着擦除将首先引发 O(n) 查找操作。

获得 O(1) 擦除的推荐方法是什么std::list?或者,是否有更好的方法来实现目标?


过去,我通过实现自己的列表数据结构来实现这一点,其中放置在列表中的项目有自己的下一个和上一个指针。管理这些指针是很自然的,因为它们是列表操作本身所固有的(我的列表实现的 API 调整指针)。如果我想使用 STL,实现此目的的最佳方法是什么?我提出了嵌入迭代器的稻草人建议。有更好的方法吗?

如果需要具体的用例,请考虑计时器实现。创建计时器后,会将其放入适当的列表中。如果被取消,则希望有效地去除它。 (这个特定的示例可以通过标记而不是删除来解决,但它是实现取消的有效方法。)可根据要求提供其他用例。


我探索的另一种选择是融合std::list with a std::unordered_map为指针类型创建专门的列表。这是更重量级的(因为哈希表),但提供了一个在接口级别非常接近标准容器的容器,并且使我能够以 O(1) 的方式擦除列表元素。稻草人提案中唯一缺少的功能是指向当前包含该项目的列表的指针。我已将当前的实施放在代码审查 https://codereview.stackexchange.com/q/31886征求意见。


std::list::erase保证为 O(1)。

没有太多其他方法可以从标准列表中删除元素。 (std::list::remove而且朋友不会做完全相同的事情,所以他们不算数)。

如果要从标准列表中删除,则需要一个迭代器和列表本身。这就是你似乎已经拥有的。没有太多的自由来以不同的方式做事。我会将列表包含与对象分开,这与您所做的不同,因为为什么要创建一个一次只能位于一个列表中的对象呢?对我来说似乎是不必要的人为限制。但无论你的设计有什么动力。

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

如何从 std::list 实现 O(1) 擦除 的相关文章

  • C 中的隐秘结构定义

    我遇到了以下情况迷宫定义 https github com gduarte lkb blob master code stack maze h code typedef struct mazeNode int hasCheese int t
  • 返回带有列表对象的列表对象

    我有三个表 汽车品牌 汽车型号 和 CarsandModel 我有 Carsand 模型表 因为一个模型可以由多个制造商构建 我想返回包含汽车型号列表的汽车品牌列表 我现在的长篇大论不是过滤汽车型号的汽车制造商列表 我尝试添加一个 wher
  • 通过指向基址的指针删除对象而不使用虚拟析构函数

    我有代码 class A1 public A1 cout lt lt A1 virtual A1 cout lt lt A1 class A2 public A2 cout lt lt A2 A2 cout lt lt A2 class B
  • 如何将 int.TryParse 与可为空的 int 一起使用? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 TryParse 来查找字符串值是否为整数 如果该值为整数 则跳过 foreach 循环 这是我的代码 string strValue 42 if int TryParse trim strVal
  • Swashbuckle 在 ASP.NET Core 中失败并出现 NotSupportedException 异常

    我跟着这个关于如何在我的 asp net core 2 2 项目中添加 swashbuckle 当我运行该项目时 我收到以下错误 处理请求时发生未处理的异常 NotSupportedException HTTP 方法 GET 和路径 id
  • tmpnam 的 C/C++ 线程安全性?

    我需要使用tmpnamC 中的函数 但我需要了解它的线程安全性 也就是说 如果我有多个线程 每个线程都需要为临时文件获取不同的名称 我是否可以保证每个线程都会收到具有不同名称的文件 tmpnam 仅保证该文件当时不存在 但它可能会在您自己创
  • 当假设 [[assume]] 包含 UB 时会发生什么?

    在 C 23 中 assume expression 属性使得如果表达 is false 行为未定义 例如 int div int x int y assume y 1 return x y 这会编译成相同的代码 就像y一直是1 div i
  • MPI_Gather 分段错误

    我有这个并行高斯消除代码 调用以下任一方法时会发生分段错误MPI Gather函数调用 我知道如果没有为任一缓冲区正确分配内存 可能会出现此类错误 但我看不出内存管理代码有什么问题 有人可以帮忙吗 Thanks Notes 该程序从一个 t
  • esp8266互联网交换机问题

    我正在尝试制作一个门继电器开关系统 我可以通过端口转发从任何地方进行操作 我找到了一个非常有用的指南和代码 我的程序基于 https openhomeautomation net control a lamp remotely using
  • 如何使用 Unity 动态注册通用类?

    我有一个包含很多类 300 和 BaseClass 的程序集 我想用接口注册一个泛型类 统一后 您必须在 Name如果你想解析接口的对象数组 我想要一个对象数组主视图模型自动地 有没有办法通过反射来自动执行此操作 有什么建议么 示例 伪 p
  • 是否可以将 CMFCToolBar 添加到对话框中?

    我刚刚尝试了将 CToolbar 添加到新 CMFCToolBar 上的对话框的标准方法 但这不起作用 在我深入研究新的实现之前 我想知道它是否真的可行 我不确定你所说的 标准方式 是什么意思 但你当然可以以编程方式做到这一点 In MyD
  • 使用迭代器遍历 boost::ublas 矩阵

    我只是想从头到尾遍历一个矩阵 触及每个元素 然而 我发现升压矩阵没有一个迭代器 而是有两个迭代器 而且我无法弄清楚如何使它们工作以便您可以遍历整个矩阵 typedef boost numeric ublas matrix
  • 如何防止打印屏幕

    我有一个要求 我正在开发的应用程序阻止用户轻松捕获屏幕内容 我已经表示 没有可行的方法可以完全防止这种情况发生 但我正在寻找方法来为这一过程引入一些障碍 我正在使用 C NET 2 0 和 WinForms 你不能 您能做的最好的事情就是在
  • 使用 C# 从文本中删除数字

    我有一个要处理的文本文件 其中有一些数字 我只想要其中的文字 而不是其他任何东西 我成功删除了标点符号 但是如何删除数字呢 我想要使 用 C 代码 另外 我想删除长度大于 10 的单词 如何使用 Reg 表达式来做到这一点 您可以使用正则表
  • 如何在C#中使用默认浏览器打开带有锚点(#)的html文件

    我正在尝试在 C 中打开上下文帮助文件 当我没有指定锚点时 它工作得很好 Process Start C Help Help htm 但是当我指定锚点时 它不会打开 Process Start C Help Help htm Toc3420
  • 找到两个值的平均值的正确方法是什么?

    我最近了解到整数溢出是 C 中的未定义行为 附带问题 C 中也是 UB 吗 在 C 编程中 您通常需要求两个值的平均值a and b 然而做 a b 2可能会导致溢出和未定义的行为 所以我的问题是 找到两个值的平均值的正确方法是什么a an
  • 寻找自定义 SynchronizationContext 的示例(单元测试所需)

    我需要定制同步上下文 http msdn microsoft com en us library system threading synchronizationcontext aspx that 拥有一个运行 Posts 和 Sends
  • 是否可以在 ASP.NET Web API 和 SPA 中使用基于 cookie 的身份验证?

    我想创建基于 angularjs 前端和 ASP NET Web API 的 Web 应用程序 我需要创建安全 api 但我无法在将实施此 Web 应用程序的公司服务器上使用基于令牌的身份验证 是否可以对 SPA 和 ASP NET Web
  • timeval_subtract 解释

    使用 timeval subtract 函数来查找两个 struct timeval 类型之间经过的时间 有人可以解释一下用于 通过更新 y 执行后续减法的进位 和其他部分的目的和逐步数学吗 我了解该函数的目的以及如何在程序中实现它 但我想
  • 我的 Visual Studio 2008 模板有什么问题?

    我正在尝试为 Visual Studio 创建自己的类模板 称为 公共类 我跟着有关如何手动创建项目模板的官方 MSDN 说明 http msdn microsoft com en us library ms247113 aspx几乎一字不

随机推荐

  • java.lang.NoSuchMethodError:没有接口方法 onTransitionToIdle()V

    请告诉我 我是 Android 测试新手 我一直在尝试修复初始 NavigationView 测试 但收到错误 我只是想打开抽屉并单击菜单以进入新活动 java lang NoSuchMethodError No interface met
  • 如何将 CloudStorageAccount 输入绑定到 Azure Function?

    我的简化代码示例 我在 Visual Studio 2017 中构建了以下简化的 Azure Function 代码 public static class FunctionApp FunctionName MyFunction publi
  • 如何删除内联/内联块元素之间的空格?

    这些之间将有 4 像素宽的空间span要素 span display inline block width 100px background color palevioletred p span Foo span span Bar span
  • Skyfield 轨道与太阳系重力场的整合 - 速度问题

    在下面所示的时间测试中 我发现Skyfield http rhodesmill org skyfield 需要几百微秒到一毫秒才能返回obj at jd position km对于单个时间值jd 但较长时间的增量成本JulianDate对象
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • CouchDB 的自定义 REST API?

    我一直在谷歌上搜索 试图找到例子或者直接回答我的问题 是否可以为 couchDB 创建 扩展我自己的自定义 api 端点 例如我可以创建一个 api 调用吗http 127 0 0 1 5984 database FillDatabase
  • IBM .NET Data Provider 连接字符串与库列表的问题

    我尝试在 C 程序中使用 DB2 Net Data Provider 而不是依赖 ODBC 下面的连接字符串有效 但仅适用于一个库 假设我的库是 test1 和 test2 Data Source xxx xxx xxx xxx User
  • 创建元素时的 jQuery 事件

    我想在创建元素时触发一个事件 document on load TB title function console log loaded 是否有与此等效的有效方法 我看到有人建议 livequery 但这似乎很重 Thanks 我不认为这样
  • 如何使用python在mysql数据库中存储阿拉伯文本?

    我有一个阿拉伯字符串说 txt u Arabic u0627 u0644 u0637 u064a u0631 u0627 u0646 我想把这段阿拉伯文文本转换成mySql数据库 我尝试使用 txt smart str txt or txt
  • 如何在 PHP 中高效使用 try...catch 块

    我一直在 PHP 代码中使用 try catch 块 但我不确定是否正确使用了它们 例如 我的一些代码如下所示 try tableAresults dbHandler gt doSomethingWithTableA tableBresul
  • 在 JavaScript 中声明函数 [重复]

    这个问题在这里已经有答案了 这两种声明函数的方式有什么区别 function someFunc var someFunc function 我不是在技术意义上问 我并不是问哪种可读性更好 或者哪种风格更受欢迎 我和这里大多数人的观点不同 从
  • iPhone Facebook 视频上传

    我已经为此工作了几天 但似乎无法在任何地方找到直接的答案或示例 我正在尝试从我的 iPhone 应用程序中将视频上传到 Facebook 我可以使用以下命令毫无问题地连接到 Facebook 并已上传图片 facebook Facebook
  • 衡量代码质量时的代码行 VS 指令

    我有一个由许多模块组成的项目 我正在运行两者JaCoCo http www eclemma org jacoco 对于单元测试覆盖率和Sonar https www sonarqube org 为了代码质量 由于技术原因 我无法对我的模块之
  • Java:在实例化期间传递“this”的实例[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的班级1 public class myClass1 public myClass2 myclass2 public void cr
  • 为什么有些 Python 变量保持全局,而有些需要定义为全局

    我在理解为什么有些变量是局部变量而有些变量是全局变量时遇到了一些困难 例如 当我尝试这个时 from random import randint score 0 choice index map a 0 b 1 c 2 d 3 questi
  • 何时调用 Thread.currentThread().interrupt() 何时不调用?

    从互联网上的多篇文章来看 建议不要吞咽InterruptedException 当我要重用同一个线程时 使用类似这样的线程池执行器来执行此操作更有意义 public static void main String args throws I
  • SQL LIKE % 对于整数

    在 T SQL 中 如何编写查询来为列的任何整数值选择行 比如数据是这样的 NAME AGE A 10 B 20 C 10 D 20 并且有一个
  • 根据控件宽度缩放 UISegmentedControl 标签

    这似乎是理所当然的 但我找不到任何方法来做到这一点 基本上我拥有的是UISegmentedControl带有两个本地化标签NSLocalizedString 我已经设置了字体大小 并且所有内容在英语和其他几种语言中看起来都很棒 但是 在日语
  • 位置:Flash 上的绝对 div

    是否有可能position absolute a div div 在 Flash 横幅上 无需添加wmode transparent 到横幅 我有一个灯箱需要显示在我的广告上方 但我无法直接修改横幅 因为它们来自第三方 Edit 问题主要出
  • 如何从 std::list 实现 O(1) 擦除

    问题是推荐的使用方式是什么std list实现 O 1 删除列表项 通常 当我选择双向链表时 我希望能够在 O 1 时间内从列表中删除一个元素 然后在 O 1 时间内将其移动到不同的列表 如果该元素有自己的prev and next指针 没