这是灵感来自Effective C#第一版中的一个项目,警告关于凌驾GetHashCode()
。当一个`key/value`插入到`std :: map`中时,它是否创建了它自己的对象副本?
对不起,我没有支持的代码。顺便说一下,这不是一项家庭作业,我只是不熟悉C++/STL
,并且找不到有关实施的信息。
想我创造我自己的类被点名的人拥有3个公共可变的字符串字段:
- 名字,
- 中间初始
- 姓
它还提供了一个更小比操作人员先把姓名与先姓,然后是中间姓名,然后是姓氏进行比较 - 这就是全部。
我创建一个从人到int(比如年龄)的地图,并用大约20个键/值对填充它。我还将指针存储在数组中。然后我改变第五个指针指向的对象的名字,然后尝试使用这个修改过的键来查找对应的年龄(记住对象是可变的并且全开)。
为什么会发生这种情况?
A)因为std::map
使用的密钥没有改变(被复制),我改变了我自己的副本,现在我的密钥没有找到。但这怎么可能呢?我没有提供我自己的拷贝构造函数。编译器可能创建了一个默认的?
B)std::map
集合实际上是一棵红黑树,我碰巧有一个直接指向某个键的指针。当我更改密钥时,我直接在树的节点中更改它。现在很可能是我的节点放置不正确,并且不会使用适当的树搜索算法找到它。我应该删除节点,然后修改它们的关键字,然后重新插入它。如果是这样的话,那么我怀疑STL
集合通常是相当危险的,会导致noobs犯很多错误。
C)还有别的吗?
我将不胜感激您的见解。
你在密钥中使用了什么特定的数据类型?你说的字符串,但要清楚,他们是std ::字符串?如果是这样,A是正确的 - STL容器将复制键和值中的所有数据。 – Joe 2011-04-16 15:12:21