假设您有一个不可默认构造的类。
class A {
private:
int a;
public:
A() = delete;
A(int a0) : a(a0) {}
};
现在,我们有一些映射 Int --> A, std::map<int, A> mapping
。假设我们要为某个键 0 创建一个新映射,如果该键存在,我们要替换旧值。对默认可构造类执行此操作的方法是:
mapping[0] = A(4);
然而,对于 A 类,这将失败,因为 operator[] 首先构造了 A 的默认实例,然后才会分配 的值A(4)
。通常这样做的一种方法(即对于非默认可构造类)是这样的:
auto it = mapping.find(0);
if (it == mapping.end()) {
mapping.insert(0, A(4));
}
else {
it->second = A(4);
}
我的问题是:这真的是(C++)预期的方式吗?我觉得这是不对的;作为一名程序员,我不想为这么少的东西编写这么多的代码。但似乎没有简单的出路:我查找了常见的映射方法(插入、emplace、emplace_hint),如果密钥已经存在,它们都什么都不做。