【发布时间】:2013-11-05 18:55:39
【问题描述】:
我在 stackoverflow 上阅读了很多关于 unordered_map(c++11) 时间复杂性的内容,但我还没有找到我的答案问题。
假设按整数索引(仅举例):
Insert/at 函数持续工作(平均时间),所以这个例子需要 O(1)
std::unordered_map<int, int> mymap = {
{ 1, 1},
{ 100, 2},
{ 100000, 3 }
};
我很好奇的是遍历存储在 map 中的所有(未排序的)值需要多长时间 - 例如
for ( auto it = mymap.begin(); it != mymap.end(); ++it ) { ... }
我可以假设每个存储的值只被访问一次(或两次或恒定时间)吗?这意味着遍历所有值都在 N 值映射 O(N) 中。另一种可能性是我的带有键 {1,10,100000} 的示例可能需要多达 1000000 次迭代(如果由数组表示)
是否还有其他容器可以线性迭代并通过给定键不断访问值?
我真正需要的是(伪代码)
myStructure.add(key, value) // O(1)
value = myStructure.at(key) // O(1)
for (auto key : mySructure) {...} // O(1) for each key/value pair = O(N) for N values
std::unordered_map 是我需要的结构吗?
整数索引就足够了,平均复杂度也是如此。
【问题讨论】:
-
如果您担心枚举需要遍历您未插入容器的配对,请放心,它不会。使用常规
map与unordered_map的决定应基于您是否需要对密钥保留 进行相对严格的弱排序。如果你这样做,你需要一个普通的map。如果您不这样做,unordered_map是最合乎逻辑的选择(前提是可以将密钥散列到合理的分布)。 -
@WhozCraig:在选择
map或unordered_map时要考虑的另一个功能因素是后者在insert/emplace/[]触发期间是否使现有迭代器/引用/指针失效重新散列是可以接受的,然后会有性能差异倾向于有利于unordered_map,但应该由那些分析器/仪器说必须真正关心的人来衡量......
标签: c++ stl iteration time-complexity unordered-map