unordered_map 覆盖现有元素
unordered_map over-writing existing element
我正在尝试更新对象的一个 class 成员(将存储在 unordered_map 的 unordered_map 中),然后再更新另一个 class 同一对象的成员。
typedef unordered_map<int, X> inner_map;
typedef unordered_map<int, inner_map> outer_map;
struct X{
Mem a;
Mem b;
};
void myFunc(outer_map* o_map,
const Mem* m_obj,
const int outerkey,
const int innerkey){
X local_x; // Create local X for inserting when doesn't exist in map
(*(o_map))[outerkey][innerkey] = local_x; //Insert if not already present
if(SOME_VAL == m_obj->Type()){
(*(o_map))[outerkey][innerkey].a = m_obj; //Update the 'X::a' member
}
else{
(*(o_map))[outerkey][innerkey].b = m_obj; //Update the 'X::b' member
}
}
我第一次插入代表 local_x
的新 X
对象(因为它目前不存在于地图中),然后更新 local_x
中的一个 class 成员。稍后我希望更新同一对象的另一个 class 成员。似乎发生这种情况时,我实际上是在覆盖已经插入的 X 对象。我想:
(*(o_map))[outerkey][innerkey] = local_x;
只有在密钥不存在的情况下才会over-write/insert?
您的代码可以简化为:
void myFunc(outer_map* o_map, const Mem* m_obj, int outerkey, int innerkey)
{
X& x = (*o_map)[outerkey][innerkey];
(SOME_VAL == m_obj->Type() ? x.a : x.b) = *m_obj;
}
[]
-operator already 会创建一个新元素,如果给定的键不存在的话。 (它还能做什么?)
我正在尝试更新对象的一个 class 成员(将存储在 unordered_map 的 unordered_map 中),然后再更新另一个 class 同一对象的成员。
typedef unordered_map<int, X> inner_map;
typedef unordered_map<int, inner_map> outer_map;
struct X{
Mem a;
Mem b;
};
void myFunc(outer_map* o_map,
const Mem* m_obj,
const int outerkey,
const int innerkey){
X local_x; // Create local X for inserting when doesn't exist in map
(*(o_map))[outerkey][innerkey] = local_x; //Insert if not already present
if(SOME_VAL == m_obj->Type()){
(*(o_map))[outerkey][innerkey].a = m_obj; //Update the 'X::a' member
}
else{
(*(o_map))[outerkey][innerkey].b = m_obj; //Update the 'X::b' member
}
}
我第一次插入代表 local_x
的新 X
对象(因为它目前不存在于地图中),然后更新 local_x
中的一个 class 成员。稍后我希望更新同一对象的另一个 class 成员。似乎发生这种情况时,我实际上是在覆盖已经插入的 X 对象。我想:
(*(o_map))[outerkey][innerkey] = local_x;
只有在密钥不存在的情况下才会over-write/insert?
您的代码可以简化为:
void myFunc(outer_map* o_map, const Mem* m_obj, int outerkey, int innerkey)
{
X& x = (*o_map)[outerkey][innerkey];
(SOME_VAL == m_obj->Type() ? x.a : x.b) = *m_obj;
}
[]
-operator already 会创建一个新元素,如果给定的键不存在的话。 (它还能做什么?)