我什么时候应该使用unordered_map而不是std::map
When should I use unordered_map and not std::map
我想知道在哪种情况下我应该使用unordered_map而不是std::map。
每次我不注意元素在映射中的顺序时,我都必须使用无序映射?
map
- 通常使用红黑树实现
- 元素已排序
- 内存使用量相对较小(哈希表不需要额外的内存)
- 相对快速的查找:O(log N)
unordered_map
- 通常使用哈希表实现
- 元素未排序
- 需要额外的内存来保存哈希表
- 快速查找O(1),但恒定时间取决于哈希函数,该函数可能相对较慢。还要记住,你可能会遇到生日的问题
比较哈希表(undorded_map
)和二进制树(map
),记住CS类并进行相应调整。
散列映射在查找时通常具有O(1),映射具有O(logN)。如果您需要许多快速查找,这可能是一个真正的区别。
地图保持元素的顺序,这有时也很有用。
map
允许以排序的方式迭代元素,但unordered_map
不允许
因此,当您需要按排序顺序遍历映射中的项目时,请使用std::map
。
选择其中一个的原因是性能。否则,他们只会创建std::map
,因为它为您做得更多:)
当您需要对元素进行自动排序时,请使用std::map
。其他时间使用std::unordered_map
。
请参阅SGI STL复杂性规范的基本原理。
unordered_map
是O(1),但查找、插入和删除的常量开销相当高。map
是O(log(n)),所以选择最适合您需要的复杂性。此外,并非所有关键点都可以放置在这两种类型的贴图中。
相关文章:
- 存储在 std::map/std::set 中,与在存储所有数据后对向量进行排序
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 无法在 std::map<std::string,std::shared_ptr 中设置值<class>>
- 如何在C++中迭代集合映射(std::map<std::set< char>, int >)?
- 如何初始化结构字段 std::map<std::string, std::string>称为参数
- issue with std::map std::find
- 为什么 std::map< std::map >不释放内存?
- C++ map<std::string> vs map<char *> 性能(我知道,"again?" )
- 确定运行时std::map/std::set的内存使用情况
- 映射上的模板参数无效 std::map< std::string, Stock*> &Stock
- 我的SFINAE检查std::map/std::vector有什么问题
- 使用 std::map<std::string, int> 计算表达式树
- 将数据从两种不同的数据结构插入 std::map <std::string, int> mymap 并通过套接字发送
- 类中的编译器错误,数据类型为 typedef map<std::string,std::p air<std::string,vector<int>>> MapPai
- C++ std::map<std::string, std::set<std::string>> .如何循环设置值?
- 如何填写和访问 std::map<std::p air<enum1, enum2>, funcPtr>?
- 二进制'<':找不到 map<std::string shared_ptr 的运算符<Foo>>
- 如何将 2 个字符* 数组直接映射到 std::map<std::string,std::string>
- C++ std::map<std::string, int> 获取键以特定字符串开头的值
- 从取消引用的迭代器返回 std::map<std::string, int> 时出现巨大的内存泄漏