是std::unordered_set连续的(类似于std::vector)

Is std::unordered_set contiguous (like std::vector)?

本文关键字:std 类似于 vector set unordered 连续      更新时间:2023-10-16

我将指针存储在std::unordered_set中。我这样做是因为我不想要任何重复的指针(我会删除集合中的指针,所以如果有重复的指针,我会尝试删除一个已经删除的指针(。我在这些集合中进行了大量循环,由于我知道std::vector是循环(连续内存(最快的容器,我想知道std::unordereded_set是否也这样做。

如果没有,那么使用std::向量并检查指针是否已经被删除会更快吗?

std::unordered_set是否连续?

标准中没有详细说明容器的具体实施方式然而该标准确实规定了许多约束实际表示的行为。

例如,std::unordered_set需要是内存稳定的:即使添加/删除其他元素,对元素的引用/地址也是有效的。

实现这一点的唯一方法是或多或少地独立地分配元素。它不能用连续的内存分配来实现,因为这样的分配必然是有界的,因此可能会过度增长,无法在更大的块中重新分配元素。

不,它不是连续内存,但由于有哈希映射,它仍然非常快。

编辑:快速随机访问,如果你主要做循环,你应该考虑另一个容器,我认为。

第二版:你应该进行简介,以便知道是否值得考虑另一个容器。(也许你应该在其他地方进行优化……也许(。

std::unordered_map提供了以下成员函数,这表明它可能基于哈希表使用链表进行单独的链接。

bucket_count, hash_function, load_factor, max_load_count, rehash

元素是否连续取决于分配器unordered_maplist的默认分配器不分配连续存储器中的元素为每个元素分配内存在插入时。

但是,您可以提供一个自定义分配器(例如池分配器(其可以从预先分配的存储器池中分配元素。还数据结构中的逻辑相邻元素可能不是物理上的在存储器中相邻。

因此,如果遍历所有元素是最频繁的操作,那么CCD_ 6可能不是最佳解决方案。通过所有竞争解决方案的探查器运行主要用例将揭示最佳解决方案。

除此之外,unordered_map并不是为另一个循环的最佳选择原因请注意名称中的单词">无序",它传达了与listvectormap不同的是,元素没有顺序。例如,成员函数CCD_ 11可以改变元素的相对顺序。事实上只要容器的负载系数为,容器就会自动执行再清洗在任何操作期间都将超过CCD_ 12。

std::unordered_set应该是一个哈希映射容器,所以我们可以假设它与std::vector相比会有一些性能损失。

但我认为,如果undered_set访问是真正的热点,那么您必须查看实际的评测结果。

如果您使用的STL实现是合理的,那么它应该为指针或int类型键提供类似向量的专门化。如果这是真的,那么专门用于指针类型的unordered_set的行为将非常类似于自动增长/收缩向量,并且性能差异将不明显。