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的区别的主要内容,如果未能解决你的问题,请参考以下文章
从 Pytorch C++ 中的 c10::Dict<c10::IValue, c10::IValue> 获取值