假设您有一个默认不可构造的类。
class A {
private:
int a;
public:
A() = delete;
A(int a0) : a(a0) {}
};
现在,我们有一些地图诠释- > A, std::map<int, A> mapping
。假设我们要为某个键0创建一个新的映射,如果键存在,我们要替换旧值。对默认可构造类执行此操作的方法是:
mapping[0] = A(4);
但是,这对于类A将失败,因为operator []首先构造A的默认实例,然后才分配A的值A(4)
。通常这样做的一种方法(例如,对于非默认可构造类)是:
auto it = mapping.find(0);
if (it == mapping.end()) {
mapping.insert(0, A(4));
}
else {
it->second = A(4);
}
我的问题是:这真的是(C ++)的预期方式吗?我觉得这是不对的。作为一名程序员,我不想花那么多代码就写那么多。但是似乎没有简单的出路:我已经查找了常见的地图方法(insert,emplace,emplace_hint),如果键已经存在,则所有这些方法均不执行任何操作。
我查找了常见的地图方法(插入,emplace,emplace_hint),如果键已经存在,则所有这些方法均不执行任何操作。
C ++ 17通过以下方式解决了这一点std::map::insert_or_assign
:
template <class M> pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);
如果密钥等同于
k
已在容器中存在,受让人std::forward<M>(obj)
到mapped_type
对应于该键k
。如果键不存在,则插入新值,就像通过insert一样,从构造它value_type(k, std::forward<M>(obj)
。
这使得
auto it = mapping.find(0);
if (it == mapping.end()) {
mapping.insert(0, A(4));
}
else {
it->second = A(4);
}
好像
mapping.insert_or_assign(0, A(4));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句