Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代有序容器与无序容器_C++_C++11_Unordered Map_Unordered Set_Stdset - Fatal编程技术网

C++ 迭代有序容器与无序容器

C++ 迭代有序容器与无序容器,c++,c++11,unordered-map,unordered-set,stdset,C++,C++11,Unordered Map,Unordered Set,Stdset,我想知道在std::set,std::map和std::unordered\u set,std::unordered\u map之间迭代元素时,哪些数据结构更有效 我找了这么多,找到了这个。答案要么建议复制std::vector中的元素,要么使用Boost.Container,我不回答我的问题 我的目的是在一个容器中保存大量独特的元素,大多数时候我都希望遍历这些元素。插入和取出更为罕见。我想避免将std::vector与std::unique结合使用,区别不在于排序或缺少排序,而在于支持容器。如

我想知道在
std::set
std::map
std::unordered\u set
std::unordered\u map
之间迭代元素时,哪些数据结构更有效

我找了这么多,找到了这个。答案要么建议复制
std::vector
中的元素,要么使用
Boost.Container
,我不回答我的问题


我的目的是在一个容器中保存大量独特的元素,大多数时候我都希望遍历这些元素。插入和取出更为罕见。我想避免将
std::vector
std::unique

结合使用,区别不在于排序或缺少排序,而在于支持容器。如果它是一个连续内存,由于迭代器和缓存友好性的简单实现,它应该能够快速迭代

无序容器通常存储为向量向量(或类似的东西),而有序容器是使用树实现的,但它毕竟是留给实现的。这意味着在无序版本上进行迭代应该是浪费。然而,这毕竟是留给实现的,我看到了具有不同行为的实现(为了公平起见,稍微弯曲了一些规则)

一般来说,容器性能是一个相当复杂的话题,通常必须在实际应用中进行测试才能得到可靠的答案。有很多实现定义的东西可能会影响性能。如果我必须瞎着走的话,我会选择hash_set。复制到
向量中
可能也是一个不错的选择

编辑:正如@TonyD在其评论中所说,有一条规则,当未超过
max\u load\u factor()
时,不允许在添加元素期间使迭代器无效,这实际上排除了内存中连续的备份容器


因此,将所有内容复制到向量中似乎更合理。如果需要删除重复项,一个可行的选择可能是使用
http://en.cppreference.com/w/cpp/algorithm/sort
并且容易忽略重复。我听说使用<代码>向量和<代码>排序有一个排序的数组(或向量)在需要一个容器的情况下是一个常用的选项,在需要一个容器的情况下,需要比修改更多的迭代。

让我们考虑<代码> SET//COD> VS <代码> unOrdEdEdTys。p> 这里的主要区别是迭代的“性质”,即遍历集合将按顺序提供元素,而遍历无序集合中的某个范围将不按特定顺序提供一组值

假设您要遍历一个范围
[it1,it2]
。如果我们排除查找元素it1和it2所需的查找时间,那么就不可能有从一种情况到另一种情况的直接映射,因为即使使用相同的元素构造容器,也不能保证两者之间的元素是相同的

但是,在某些情况下,当您希望遍历固定数量的元素(无论它们是什么)或需要遍历整个容器时,类似的内容具有意义。在这种情况下,需要考虑<强>执行机制<强>:

集合的实现方式通常类似于红黑树(二进制搜索树的一种形式)。与所有二进制搜索树一样,它允许高效的顺序遍历其元素(LRR:左根右根)。也就是说,遍历需要支付指针跟踪的成本(就像遍历列表一样)

另一方面,无序集是哈希表,对我来说,STL实现使用哈希和链接。这意味着(在非常高的层次上)结构所使用的是一个(连续的)缓冲区,其中每个元素都是包含元素的链(列表)的头。元素在这些链(bucket)和缓冲区中的布局方式将影响遍历时间,但是这次您将再次在不同的列表中寻找指针。我不认为它会与树的情况有很大的不同,但肯定不会更好


在任何情况下,微调整和基准测试都将为您的特定应用程序提供答案

从最快到最慢的迭代应该是:set>map>unordered\u set>unordered\u map;
set比map轻一点,它们是用二叉树规则排序的,所以应该比无序的容器快。

如果迭代频繁,你真的,真的,真的需要一个向量。@101010:一般来说,这些问题不能通过思考来回答,只能通过实证测试来解决——答案可能会随着计算机本身、计算机上运行的其他东西、库实现、容器的使用方式等的不同而变化。@101010:我无法计算我读过多少次。“我不能使用Boost。”除非你的目标平台实际上不支持Boost,否则我无法真正理解是谁提出了这样的限制。Boost是仅次于标准库的最佳选择,将其排除在原则项目之外是。。。。好。。。在我超越这里的界限之前。;-)@101010:我只想说我希望你有足够的地位来讨论这个问题。至少让他们告诉你原因,因为不使用C++的Boost有点像在java中不使用设计模式,因为…未知。;-)@Hurky'不能被认为是“有助于思考”的答案。无序容器通常被存储为向量的向量(或类似的东西)。:鉴于标准要求exi