不会使迭代器(和指针)失效的容器

2023-12-19

我目前正在寻找提供一些插入(insert 或push_back)和一些删除(erase,pop_back 不够)方法的容器,并且在调用这两个方法时不会使迭代器或指针无效。

更清楚地说,我想要一组元素,我可以在其中添加元素(我不关心在哪里),以及在哪里可以删除任何元素(所以我关心在哪里)。此外,我会有指向特定元素的外部指针,并且如果我从集合中添加或删除元素,我希望它们保持有效。

据我所知,有两个标准容器可以满足我的需求:set and list。不过,一般来说,我不喜欢使用这样的容器来满足这么简单的需求。自从一个list在内部涉及指针并且不提供对其元素的随机访问,我认为这不是一个好的选择。 Aset可以随机访问其元素,但也涉及指针,并且随机访问本身不是在恒定时间内完成的。我认为一个set将是一个比list,但我想到了别的事情。

一个简单的向量在删除元素时不尝试保持元素连续怎么样?当删除该容器中间的元素时,它的位置将为空,并且不会发生其他任何事情。这样,迭代器或指针就不会失效。另外,当添加元素时,容器会搜索空位置,并使用简单的push_back如果没有这个洞的话。

显然,自从push_back可以使迭代器无效vector,我会用一个deque作为实施的基础。我还会使用某种堆栈来跟踪删除元素的漏洞。这样,除了满足我的无失效需求之外,添加、删除和访问元素也可以在恒定时间内完成。

然而,仍然存在一个问题:当迭代这个容器或简单地通过索引访问元素时,我们需要考虑这些漏洞。这就是问题开始超过优势的地方。

因此我的问题是:您对我关于该容器的想法有何看法? 更重要的是,你会用什么来解决我原来的问题,aset, a list或者是其他东西 ? 另外,如果您对最后一个问题(迭代我的容器)有一个好的、干净的解决方案,请随时向我展示。


要求1:插入(插入或推回)和一些删除(擦除,不仅仅是最后一个元素)

  • 符合要求的候选人:deque, forward_list, list, map, multi_map, set, multiset, unordered_map, unordered_multimap, unordered_set, unordered_multiset, and vector

  • 被淘汰的候选人:array (no insert or push_back), queue, priority_queue and stack (no erase, only pop)

要求2:调用这两个方法时不会使迭代器或指针失效

  • 同时满足要求 1 的合格候选人:forward_list, list, map, multi_map, set, multiset,
  • 擦除时消除:deque(迭代器仅在擦除第一个元素时保持有效),并且vector(擦除开始后的所有元素)
  • 插入时消除:dequeue(在大多数情况下),unordered_map, unordered_multimap, unordered_set and unordered_multiset(以防增长需要重新调整)和vector(如果增长需要重新分配)

要求3:外部指针应保持有效

与要求 2 的结果大致相同。但是unordered_map, unordered_multimap, unordered_set and unordered_multiset将满足要求,因为对元素的引用仍然有效。

要求4:随机访问元素

  • 符合要求 1 和 2 的合格候选人:map and multimap
  • 几乎符合要求的候选人:set and multiset没有随机访问,但可以使用成员来满足find()(O(logn))
  • 不合规:列表(尽管算法find()可以提供 O(n)) 的解决方法。

回答问题1:哪个更好,一个set or a list ?

这取决于您的其他要求。在一个集合中,每个值只能存储一次。如果您的元素都是独一无二的,请选择该集合。如果没有,您最好选择列表或多重集。

我不知道您要存储的元素,但整个元素是搜索参数吗?或者有钥匙吗?在后一种情况下,你真的会去找地图。

回答问题2:替代容器怎么样?

我不会选择双端队列作为您的替代方案。

如果您可以预见元素的最大数量,您可以简单地保留足够的容量以避免重新分配。 (满足要求1、3和4)。 如果您有一个“空元素”来表示孔,那么您也可以满足要求 2。在最坏的情况下,您可以选择一个向量来存储您的元素和一个指示符(如果它有效)。

如果这样的最大值无法确定,我宁愿选择map事实证明,它非常灵活,可以满足您的所有要求。

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

不会使迭代器(和指针)失效的容器 的相关文章

随机推荐

  • CMake检查主项目是否被调用

    我有这样的项目目录设计 Main CMakeLists txt subproject1 CMakeLists txt subproject2 CMakeLists txt 如果 subproject1 cmake 被主项目调用 或者作为独立
  • 根据字段值增量并创建记录

    访问2003 最终 我需要创建一个用于打印标签 样品 ID 罐 x of x 的报告 我的桌子上有样品 ID 和罐子数量 是否可以创建一个查询 为我提供 3 个字段 样品 ID 罐号 罐数 其中罐号根据罐数以增量方式创建记录 Query S
  • Java - 编译错误方法无法调用

    我必须使用测试工具编译我的代码 但是 当该测试工具调用我的方法时 我收到此错误 Course 类中的 getCourseDetails 方法不能应用于给定类型 必需 java lang String int java lang String
  • Typescript 将元组的类型元组转换为元组(展平元组)

    我有这个 Type T Params lt Tuple1 Tuple2 gt eg string number 制作方法 压扁 Type Flatten
  • 如何锁定 cytoscape.js 节点在其父节点内的位置

    我想锁定节点相对于其父复合节点的位置 这样 如果我抓取并拖动父节点 子节点会随之移动 但子节点不能单独抓取 如果我将子项设置为不可抓取和 或锁定 那么它不会与其父项一起移动 但如果我不这样做 它可以被单独拖动 这是我不想要的 这可以做到吗
  • 如何将参数(名称)传递给函数工厂?

    我需要构建许多带有许多不同参数的函数 尽管它们共享许多代码和结构 为了避免重复 我想我应该聪明地为自己构建一个函数工厂 又名闭包 我不知道如何在函数工厂内传递函数参数 我的用例是一堆 S3 构造函数 所有这些函数都共享相同的验证机制 所以我
  • 如何将测试用例从 Excel 导入到 VSTS/Azure DevOps

    我有很多测试用例当前位于 Excel 中 我需要将它们迁移到 VSTS Azure DevOps 有人可以推荐我一个好方法吗 这是一种手动方式 但也许对您有用 在 IE 或 Edge 上 您可以在测试计划中尝试网格视图 然后复制 粘贴测试用
  • Java LibGDX 如何解析 JSON?

    我有一个 json 文件 内容如下 players name hp 100 name hp 120 weapons name Desert Eagle price 100 name AK 47 price 150 如何将其解析为武器数组 我
  • 获取和转换与条件格式

    我正在尝试使用conditional formatting的输出Get Transform询问 Office 365 Excel 2016 32 位 Windows 10 专业版 64 位 但是 当刷新查询时 条件格式不仅仅是扩展 收缩以影
  • 如何将 pandas DataFrame 表保存为 png

    我构建了一个结果的 pandas 数据框 该数据框充当表格 有 MultiIndexed 列 每行代表一个名称 即index name1 name2 创建 DataFrame 时 我想显示这个表格并将其保存为 png 或任何图形格式 目前
  • Angular ui grid双击事件设置

    所以我试图让我的 Angular UI 网格在整行上注册双击事件以打开模式 我可以从烤面包开始 然后从那里开始 这是我根据在线各种演示和示例得出的最接近的结果 但我似乎无法让它发挥作用 控制器 scope gridHandlers onDb
  • 为什么我不能在 Java 中声明同一个变量两次?

    这里有类似的问题 但他们并没有真正回答我的问题 所以我很好奇为什么我们不能在Java中声明同一个变量两次 例如 int a 4 int a 6 这在 Java 中实际上行不通 然而在 javascript 中 这实际上是有效的 var a
  • Angular 1 材料设计在 Firefox 中关闭对话框后滚动到顶部

    您好 当我在 Firefox 中使用 Angular 材质打开对话框窗口时 对话框关闭后页面滚动到顶部 任何人都可以解释为什么会发生这种情况或有解决方法 See https codepen io WitteStier full EmzKQb
  • 在 pyo 和 python 中播放声音

    我正在尝试pyo https github com belangeo pyo对于蟒蛇 我使用主页中的以下命令安装了 ubuntu 的 pyo sudo apt get install libjack jackd2 dev libportmi
  • 如何在caffe中将多个N维数组输入到网络中?

    我想在 caffe 中创建一个用于语义分割的自定义损失层 需要多个输入 我希望这个损失函数有一个额外的输入因子 以惩罚小物体的漏检 为此 我创建了一个图像 GT 其中每个像素都包含一个权重 如果像素属于小物体 则权重较高 我是 caffe
  • 使用 phpmyadmin 导入 CSV utf8

    我正在尝试导入包含韩语字符的数据集 并使用 CSV LOAD DATA 保存为 unicode 编码 即使当我将输入字符集设置为 utf8 时 韩语也会被损坏 该列的编码当然是 utf8 示例记录 制表符分隔 79 read NULL MY
  • 通过 Web 代理获取 Azure 访问令牌

    我们正在使用Microsoft IdentityModel Clients ActiveDirectory用于从 Azure AD 获取访问令牌的 API 我们要求 API 调用必须通过 Web 代理 我们找不到任何相关的示例代码 有没有什
  • getSupportActionBar().setCustomView(view) 未填充整个操作栏

    我正在尝试设置我的应用程序的自定义视图 但我所做的布局没有填充整个操作栏 我尝试了很多样式设置 但没有一个对我有用 这是我在活动中的代码 View view getLayoutInflater inflate R layout action
  • 为什么 MongoDB 节点驱动程序会生成实例池损坏错误?

    当我运行以下代码时 我收到错误消息 MongoError 服务器实例池被破坏 知道为什么或如何解决这个问题吗 var csv require importer js var MongoClient require mongodb Mongo
  • 不会使迭代器(和指针)失效的容器

    我目前正在寻找提供一些插入 insert 或push back 和一些删除 erase pop back 不够 方法的容器 并且在调用这两个方法时不会使迭代器或指针无效 更清楚地说 我想要一组元素 我可以在其中添加元素 我不关心在哪里 以及