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 会创建一个新元素,如果给定的键不存在的话。 (它还能做什么?)