我读过很多关于unordered_map(C++ 11)时间复杂度计算器在这里,但我还没有找到我的问题的答案。C++的std :: unordered_map复杂
让我们整(只是举例)假设索引:
插入/在功能不断地努力(平均时间),所以这个例子将采取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}例如可能需要长达百万迭代(如果阵列表示)
是否有任何其他的容器,其可以线性迭代和值由给定的密钥访问不断?
什么我真正需要的是(伪)
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' vs'unordered_map'应该基于你是否需要一个相对严格的弱键排序*保留*。如果你这样做,你需要一个定期的“地图”。如果你不这样做,'unordered_map'是最合理的选择(只要密钥可以散列到合理的分布)。 – WhozCraig
@WhozCraig:在选择'map'或'unordered_map'时要考虑的另一个功能因素是在'insert' /'emplace' /'['''触发重新哈希处理过程中后者对现有迭代器/引用/指针的无效是否可接受, '性能差异*倾向于'在unordered_map'有利的情况下,但应该由那些其分析器/仪器设备说明必须真正在意的人来衡量。 –