在C 中的地图中地图.非常困惑



我在这里有点困惑的一张映射,其中一个名称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'

最新更新