我正在寻找具有这些基本属性的类似集合的容器类:
用例是我有一个更大的对象容器。在每个循环期间,我将向这个新容器添加这些对象的子集。该子集可以是1-5个对象,也可以是整个集合的10%。然后我迭代这个新集合中的对象。每个循环对象将被清除,处理再次开始。
我的原始方法在对象上使用了一个入侵布尔值,表明它是否属于这个新集合。因此插入是真正的恒定时间,并且它没有使用新的内存。然而,迭代是次优的。
我尝试了boost::unordered_set
并且性能比原来的方法差。据推测,因为作为哈希映射,它无法满足Point#2。
第3点是相关的,因为我在延迟级别进行编码,其中内存分配的成本非常高。因此,具有连续分配的容器极不可能表现良好。
答案 0 :(得分:5)
使用您的第一种方法来检测元素是否已经在集合中(哈希映射)。并把它放在一个迭代列表中..
答案 1 :(得分:2)
您可以使用链接的哈希集。 java中的LinkedHashSet。我不知道c ++中是否存在实现它的库,但这个想法很简单:有一个hash set主菜,让主菜也形成一个linked list。
迭代在链表上,插入是从哈希集中进行的。请注意,此方法仅允许在其背面插入列表。
答案 2 :(得分:1)
试试Emde Boas tree。它可以满足您的目的:
答案 3 :(得分:-1)
您可以通过添加链接列表来改进您的方法。
将有一个指向插入对象的指针(或任何适合的标识符)的链接列表。另外,在每个对象中留下布尔变量,以了解它是否已经插入到列表中。