C++中python dict和tr1::unordered_map的区别

Posted

技术标签:

【中文标题】C++中python dict和tr1::unordered_map的区别【英文标题】:The difference between python dict and tr1::unordered_map in C++ 【发布时间】:2011-01-22 01:55:52 【问题描述】:

我有一个关于理解 python 字典如何工作的问题。

我记得在 python 中读到某个地方的字符串是不可变的以允许散列,这与不能直接使用列表作为键的原因相同,即列表是可变的(通过支持 .append),因此它们不能用作字典键。

我想知道 C++ 中 unordered_map 的实现如何处理这些情况。 (因为 C++ 中的字符串是可变的)

【问题讨论】:

希望我可以编辑帖子,这样我就可以编辑掉“dict's”中的“'”... ;-)(是的,我心情很坏 ;-) 非常感谢您的编辑! :-D 【参考方案1】:

所有 C++ map/set 容器中的键都是 const 的,因此是不可变的(在添加到容器之后)。

请注意,C++ 容器并非特定于字符串键,您可以使用任何对象,但常量会阻止在将键复制到容器后进行修改。

【讨论】:

如果有人使用 const_cast 乱搞键会发生什么。谢谢 参考:sgi.com/tech/stl/Map.html -- value_type 被定义为“对象的类型,pair<const key_type, data_type>,存储在地图中。”注意const @Akshay:如果有人这样做,他们会得到应得的 :) std::map 是使用红黑树实现的。更改密钥会使树无效。 unordered_map 使用哈希表实现。更改密钥意味着您可能再也找不到该项目,因为它可能在错误的哈希桶中为其新密钥。 @Akshay @Dan:更具体地说,通过 const_cast 修改 const 对象会导致未定义的行为。

以上是关于C++中python dict和tr1::unordered_map的区别的主要内容,如果未能解决你的问题,请参考以下文章

嵌套 dict 和 pybind11

从 Pytorch C++ 中的 c10::Dict<c10::IValue, c10::IValue> 获取值

Python学习笔记 set&&dict

Python 参数类型与 C++ 签名不匹配

为啥 python 的 dict 实现为哈希表,而 std::map 是基于树的?

python中字典dict的中的copy和deepcopy