gpt4 book ai didi

c++ - 当将 `key/value` 插入到 `std::map` 时,它会制作自己的对象拷贝吗?

转载 作者:可可西里 更新时间:2023-11-01 16:29:25 25 4
gpt4 key购买 nike

这受到 Effective C# 第一版中的一个项目的启发,警告不要天真地覆盖 GetHashCode()

抱歉,我没有支持代码。顺便说一下,这不是作业,我只是不太熟悉 C++/STL,也找不到有关实现的信息。

假设我创建了自己的名为 person 的类,它有 3 个公共(public)可变字符串字段:

  • 名字,
  • 中间名缩写
  • 姓氏

它还提供了一个小于运算符来比较一个人与另一个人,首先是名字,然后是中间名,然后是姓氏 - 仅此而已。

我创建了一个从人到整数(比如年龄)的映射,并用大约 20 个键/值对填充它。我还将指向我的键的指针存储在一个数组中。然后我更改第五个指针指向的对象的名字,并尝试使用这个修改后的键查找相应的年龄(记住该对象是可变的并且是开放的)。

为什么会这样?

A) 因为 std::map 使用的 key 没有改变(被复制),而我更改了自己的拷贝,现在找不到我的 key 。但这怎么可能呢?我没有提供自己的复制构造函数。也许编译器创建了一个默认值?

B) std::map 集合实际上是一棵红黑树,而我恰好有一个指向键的直接指针。当我更改 key 时,我直接在树的节点中更改它。现在很可能我的节点没有正确定位,并且不会使用适当的树搜索算法找到。我应该删除该节点,然后修改它们的 key ,然后再次重新插入。如果是这种情况,那么我怀疑 STL 集合通常是相当危险的,并且会导致菜鸟犯很多错误。

C) 还有别的吗?

非常感谢您的见解。

最佳答案

当您使用 std 容器时,所有数据都被复制到容器中。对于 map ,这也不异常(exception)。

映射对数据的一个限制是键是不可改变的。一旦插入它就固定更改 key ,您必须找到/删除并重新插入以更改 key 的值。

struct Person
{
std::string first;
std::string middle;
std::string last;
Person(std::string const& f, std::string const& s, std::string const& l) { BLABLA }
bool operator<(Person const& rhs) { return BLABLABLA;}
};
std::map<Person,int> ageMap;

ageMap[Person("Tom", "Jones", "Smith")] = 68;
ageMap[Person("Tom", "I", "Smith")] = 46;
ageMap[Person("Tom", "II", "Smith")] = 24;

当您创建 Person 数组时,除非该数组包含常量指针,否则它将失败。

Person* pMap[3];
pMap[0] = &ageMap.begin().first; // Fail need a const pointer.

Person const* pMapConst[3];
pMapConst[0] = &ageMap.begin().first; // OK. Note a const pointer.

关于c++ - 当将 `key/value` 插入到 `std::map` 时,它会制作自己的对象拷贝吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5687386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com