c++ - C++ 中是否有链接哈希集?

标签 c++ set

Java 有一个 LinkedHashSet ,这是一个具有可预测迭代顺序的集合。 C++ 中最接近的可用数据结构是什么?

目前我正在使用集合和 vector 复制我的数据。我将我的数据插入集合中。如果数据插入成功(意味着数据尚未存在于集合中),那么我将 push_back 到 vector 中。当我遍历数据时,我使用 vector 。

最佳答案

如果你可以使用它,那么一个Boost.MultiIndex带有 sequencedhashed_unique 索引的数据结构与 LinkedHashSet 相同。

否则,保留一个包含列表节点的某种类型的 unordered_set(或 hash_set,如果这是您的实现所提供的),并自己处理顺序使用该列表节点。

您当前正在做的事情(setvector)存在的问题是:

  • 数据的两个拷贝(当数据类型很大时可能会出现问题,这意味着您的两个不同的迭代返回对不同对象的引用,尽管具有相同的值。这将是如果有人编写了一些代码来比较以两种不同方式获得的“相同”元素的地址,期望地址相等,或者如果您的对象具有被忽略的 mutable 数据成员,则会出现问题顺序比较,有人编写的代码希望通过查找进行变异,并在按顺序迭代时查看变化)。
  • LinkedHashSet 不同,没有快速删除序列中间元素的方法。如果您想按值而不是按位置删除,则必须在 vector 中搜索要删除的值。
  • set 具有不同于哈希集的性能特征。

如果您不关心这些事情中的任何一个,那么您所拥有的可能就很好。如果重复是唯一的问题,那么您可以考虑保留指向集合中元素的指针 vector ,而不是重复 vector 。

关于c++ - C++ 中是否有链接哈希集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799830/

相关文章:

c++ - ofstream 由多个线程共享 - 一段时间后崩溃

C++ 对多个无序映射运行循环

java - 将 Set<T> 转换为 List<T> 的最简洁方法

Python:带有生成器的给定集合的幂集

c++ - 如何在C++中获取集合的第一个元素

c++ - "loop"中的 "loop device"是什么意思?

c++ - 我使用 gdb 跟踪 'catch' 和 'syscall' 失败,它报告找不到 'brk'?

c++ - 此 UTF-8 实现是实现定义的还是定义明确的?

c - 获取和设置路径

tags - 我为 aiml 设置的标签不起作用