C++ 嵌套映射:访问内部映射

C++ Nested map: accessing inner map

为什么在嵌套的 C++ 映射中访问内部映射有时只会更新通过外部映射访问的值?具体来说,为什么下面代码中的情况 1 和情况 3 没有更新值 m[500]["text"]?

我的理解是,在所有这些情况下索引到外部地图 returns 是对内部地图的引用。那么为什么只有第二种情况才能正确更新外部地图呢?情况 1 和情况 3 是否获取内部映射的值而不是对它的引用?

#include <iostream>
#include<map>
using namespace std;

int main()
{
    map<int, map<string, int>> m1;
    map<int, map<string, int>> m2;
    map<int, map<string, int>> m3;
    
    auto inner = m1[500];
    inner["text"] = 10;
    
    map<string, int> *ptr = &m2[500];
    (*ptr)["text"] = 20;
    
    map<string, int> inner3 = m3[500];
    inner3["text"] = 30;
    
    cout << "inner  " << inner["text"] << " map " << m1[500]["text"] << endl;
    cout << "ptr    " << (*ptr)["text"] << " map " << m2[500]["text"] << endl;
    cout << "inner3 " << inner3["text"] << " map " << m3[500]["text"] << endl;
    
    return 0;
}

这将打印出以下内容:

inner  10 map 0
ptr    20 map 20
inner3 30 map 0

我希望所有 3 个都打印非 0 值,但只有第二种情况。

auto inner = m1[500];
...
map<string, int> inner3 = m3[500];

auto 无法推导引用。这两个语句都将创建内部映射的副本。修改这些只会更新副本而不是原始值。

在两种情况下都使用引用来达到预期的效果:

auto& inner = m1[500];
...
map<string, int>& inner3 = m3[500];