gpt4 book ai didi

c++ - 如何将具有常量字段的对象添加到 std::map?

转载 作者:行者123 更新时间:2023-12-04 16:36:02 27 4
gpt4 key购买 nike

假设我有以下代码:

#include <string>
#include <map>

struct A {
const int value;
A(int value) : value{value} {}
};

int main() {
A a{3};
std::map<std::string, A> myMap;
myMap["Hello"] = a; // Error: Copy assignment operator of 'A' is implicitly deleted because
// field 'value' is of const-qualified type 'const int'.
return 0;
}

嗯,我理解错误。但是我不能为这种类型的结构覆盖 operator=,因为它有 const int value 字段。那我该怎么办?

这里的评论者提出了不同的解决方案,各有优缺点。让我清理一下我需要的行为。

  1. const int value 永远是常数。无需任何技巧或技巧来修改它。
  2. 如果 map 中不存在键,则赋值意味着“将对 [key, value] 添加到映射中”。但如果键存在,则替换值。
  3. 不默认创建 A 对象。使用 map 中不存在的键访问 map 应该会引发错误或中止等。但是不允许为不存在的键创建默认的“A”对象

如果我了解所有提出的解决方案,我能做的最好的事情就是围绕 std::map 创建一些包装器。你觉得怎么样?

最佳答案

使用 map::emplace就地构造 A:

myMap.emplace("Hello", 3);

Demo.

If the key doesn't exist in a map, then assignment means "add pair[key, value] to the map". But if the key exists, then replace thevalue.

正如@Serge Ballesta 评论的那样,当 key 已经存在时,您需要从 map 中删除节点并放置一个新节点:

const char* key = "Hello";
const int value = 3;
const auto it = myMap.find(key);
if (it != myMap.end())
myMap.erase(it);
myMap.emplace(key, value);

关于c++ - 如何将具有常量字段的对象添加到 std::map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69733780/

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