迭代unordered_map C ++

时间:2018-06-15 07:28:13

标签: c++11 unordered-map

在使用迭代器迭代地图的同时,在unordered_map中以特定顺序插入的键是否会以相同的顺序出现?

例如:如果我们在B中插入(4,3),(2,5),(6,7)。 迭代如下:

for(auto it=B.begin();it!=B.end();it++) {
    cout<<(it->first); 
}

它会给我们4,2,6或键可以按任何顺序出现吗?

2 个答案:

答案 0 :(得分:14)

关于begin unordered_map unordered_map for (auto& it: B) { // Do stuff cout << it.first; } 成员函数的cplusplus.com页面:

  

请注意,unordered_map对象不保证将哪个特定元素视为其第一个元素

所以不,不能保证元素按插入顺序迭代。

仅供参考,您可以更简单地迭代static void Main( string[] args ) { int A = 50, B = 30, C = 17; Print( () => A ); Print( () => B ); Print( () => C ); } static void Print<T>( System.Linq.Expressions.Expression<Func<T>> input ) { System.Linq.Expressions.LambdaExpression lambda = (System.Linq.Expressions.LambdaExpression)input; System.Linq.Expressions.MemberExpression member = (System.Linq.Expressions.MemberExpression)lambda.Body; var result = input.Compile()(); Console.WriteLine( "{0}: {1}", member.Member.Name, result ); }

gradle processReleaseManifest compileReleaseSources run assembleRelease

答案 1 :(得分:0)

信息已添加到@ answer提供的Aimery中,

  • 无序映射是一个关联容器,其中包含具有唯一键的键值对。搜索,插入和删除元素 具有平均恒定时间复杂度。

    在内部,这些元素不是按照任何特定顺序排序的,而是按桶分类。元素放入哪个存储桶 完全取决于其键的哈希值。这样可以快速访问 各个元素,因为一旦计算出哈希值,它就是指 元素所在的确切存储桶。

    请参阅参考。来自https://en.cppreference.com/w/cpp/container/unordered_map

  • 根据Sumod Mathilakath在Quora中给出了答案

    如果您希望按排序顺序保留中间数据,请使用std::map<key,value>代替std::unordered_map。默认情况下,它将使用std::less<>对键进行排序,因此您将获得升序的结果。

    std::unordered_map是哈希表数据结构的实现,因此它将使用std::unordered_map根据哈希值在内部排列元素。但是在std::map的情况下,通常是红黑二叉树实现。

    请参阅参考。来自What will be order of key in unordered_map in c++ and why?

所以,我认为我们得到的答案更加清楚。