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];
为什么在嵌套的 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];