我在这里有点困惑的一张映射,其中一个名称mymap是地图内的地图 显然在价值方面,第二张地图是INT与Char的非常正常的地图。在一个情况下没有(这是mymap(,它允许在另一种情况下,重复键(异常行为(,而不是。
#include <iostream>
#include <map>
using namespace std;
int main(void)
{
map<int, map<int,char> > myMap; // map inside map
map<int, char> ourMap; // normal map
myMap[1][1] = 'A';
myMap[1][2] = 'B'; // should overwrite previous value
myMap[2][1] = 'C';
myMap[2][2] = 'D'; // should overwrite previous value
ourMap[1] = 'A';
ourMap[1] = 'B';
cout << "[1][1] = " << myMap[1][1] << endl;
cout << "[1][2] = " << myMap[1][2] << endl;
cout << "[2][1] = " << myMap[2][1] << endl;
cout << "[2][2] = " << myMap[2][2] << endl;
cout << "ourMap[1] = " << ourMap[1] << endl;
return 0;
}
// And here is the output . By the way I was anticipating , [1][2] = B , [2][2] = D & ourMap[1] = B . But something else comes out .
OUTPUT :
[1][1] = A
[1][2] = B
[2][1] = C
[2][2] = D
ourMap[1] = B
是,如果我们在c 中有地图上的地图会开始偏离其正常行为,而这是不可重复的键我无法弄清楚它的情况。谁能告诉我这是怎么回事?如果这个问题听起来很有趣,很抱歉吗?
My Question is for myMap
myMap[x][y] = something
u can have only distinct value of x ?
For normal map it is like that only .
您正在想象一个不存在的问题。
没有"重复键"。
可以看到您的容器:
"myMap" map<int, map<int,char>>
|
+-- [1] "myMap[1]" map<int,char>
| |
| +-- [1] "myMap[1][1]" char
| |
| +-- [2] "myMap[1][2]" char
|
+-- [2] "myMap[2]" map<int,char>
|
+-- [1] "myMap[2][1]" char
|
+-- [2] "myMap[2][2]" char
在这条线上:
myMap[1][1] = 'A';
您访问(并且,由于尚不存在,创建( myMap[1]
。
然后,使用myMap[1]
,您可以访问 inneb 映射的键1,并分配'A'
。
接下来,在此行:
myMap[1][2] = 'B';
您再次访问myMap[1]
。没有什么需要"覆盖"。您只是再次访问myMap[1]
中的第一个元素。
这次,您访问内图的密钥2并分配'B'
。
这是编写代码的另一种方式,使用引用为这些内部地图获取更清晰的名称:
map<int,char>& firstInnerMap = myMap[1];
firstInnerMap[1] = 'A';
firstInnerMap[2] = 'B';
map<int,char>& secondInnerMap = myMap[2];
secondInnerMap[1] = 'C';
secondInnerMap[2] = 'D';
另外,请考虑map<int, string>
:
map<int, string> myMap;
myMap[1] = "Hello";
myMap[1][0] = 'J'; // change string to "Jello"
我们已经访问了字符串"称为" myMap[1]
并在其上执行了一个操作(theString[0] = 'J'
(。这对myMap
没有影响。不需要"覆盖"。
当您筑巢地图时,它没有什么不同。
ok:
myMap[1][1] = 'A';
首先调用这些功能时,mymap为空。所以,
myMap[1] // XXXX
使用索引1在该地图中创建一个条目。创建的东西本身就是一个地图。然后:
myMap[1][1] = 'A';
在第二个条目中创建一个条目,包含,映射并分配" a"。
然后
myMap[1][2] = 'B';
查找具有索引1(本身是映射(在XXX上创建的地图条目,并将带键2和值B的条目添加到该第二个,其中第二个包含地图。
因此,我们在顶级地图中有一个条目,第二层中有两个条目。
[]
操作员在找不到并插入。它将迭代器返回给定键的值。
因此,执行myMap[1]
将迭代器返回到map<int,char>
。
然后执行myMap[1][1]
将迭代器返回到char,因为从myMap[1]
返回的第二个[]
。
因此,执行myMap[1][1] = 'A'
和myMap[1][2] = 'B'
与ourMap[1] = 'A'
和ourMap[2] = 'B'
。