在使用迭代器迭代地图的同时,在unordered_map中以特定顺序插入的键是否会以相同的顺序出现?
例如:如果我们在B中插入(4,3),(2,5),(6,7)。 迭代如下:
for(auto it=B.begin();it!=B.end();it++) {
cout<<(it->first);
}
它会给我们4,2,6或键可以按任何顺序出现吗?
答案 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)
无序映射是一个关联容器,其中包含具有唯一键的键值对。搜索,插入和删除元素 具有平均恒定时间复杂度。
在内部,这些元素不是按照任何特定顺序排序的,而是按桶分类。元素放入哪个存储桶 完全取决于其键的哈希值。这样可以快速访问 各个元素,因为一旦计算出哈希值,它就是指 元素所在的确切存储桶。
请参阅参考。来自https://en.cppreference.com/w/cpp/container/unordered_map。
如果您希望按排序顺序保留中间数据,请使用
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?。
所以,我认为我们得到的答案更加清楚。