是std::unordered_set连续的(类似于std::vector)
Is std::unordered_set contiguous (like std::vector)?
我将指针存储在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_map
和list
的默认分配器不分配连续存储器中的元素为每个元素分配内存在插入时。
但是,您可以提供一个自定义分配器(例如池分配器(其可以从预先分配的存储器池中分配元素。还数据结构中的逻辑相邻元素可能不是物理上的在存储器中相邻。
因此,如果遍历所有元素是最频繁的操作,那么CCD_ 6可能不是最佳解决方案。通过所有竞争解决方案的探查器运行主要用例将揭示最佳解决方案。
除此之外,unordered_map
并不是为另一个循环的最佳选择原因请注意名称中的单词">无序",它传达了与list
、vector
或map
不同的是,元素没有顺序。例如,成员函数CCD_ 11可以改变元素的相对顺序。事实上只要容器的负载系数为,容器就会自动执行再清洗在任何操作期间都将超过CCD_ 12。
std::unordered_set应该是一个哈希映射容器,所以我们可以假设它与std::vector相比会有一些性能损失。
但我认为,如果undered_set访问是真正的热点,那么您必须查看实际的评测结果。
如果您使用的STL实现是合理的,那么它应该为指针或int类型键提供类似向量的专门化。如果这是真的,那么专门用于指针类型的unordered_set的行为将非常类似于自动增长/收缩向量,并且性能差异将不明显。
- 类似于strcat()的函数出现问题
- 对于多个字符(如 ETX/STX 对),是否有类似于 std::quote 的东西
- C++类似于 std::map 的数据结构,具有多个键级别
- 就地合并,类似于 std::vector 中的元素
- 使结构的行为类似于 std::tuple
- C99 中的_Complex类型在 C++ 中的行为是否类似于 std::complex<>?
- 创建一个类似于 std::integral_constant 的容器
- 为什么 std::move 的行为类似于 std::copy
- 类似于类中的 std::map 或 std::vector 的构造函数
- 为什么我需要一个类似于复合文字的临时构造来初始化我的std::数组成员
- C++类似于 std::vector / boost::array 的文件内存映射容器
- 将字符串的向量连接到std::ostream(类似于boost::Join)
- 为什么std::字符串串联运算符的工作原理类似于右关联运算符
- 为什么 std::生成类似于 std::for_each 的返回状态?
- 类似于' std::set_intersection ',但产生相等的元素对
- 对于std::tr1::unordered_map,是否存在类似于std::map::lower_bound的等效std
- 是否有std::函数类型或类似于带有auto参数的lambda
- 如何实现类似于 std::vector 的自定义类
- 是std::unordered_set连续的(类似于std::vector)
- 传递一个成员函数,类似于c++中的std::函数(类似于c#)