2017-05-04 42 views
-2

我有點困惑這裏有一個地圖名稱myMap是一個地圖裏面的地圖 明顯在價值方面,而第二個地圖是 非常正常的地圖的int與字符。 沒有在一種情況下(這是我的地圖)它允許 重複鍵(異常行爲),而在另一種情況下它不允許。在C++中映射內部地圖。很混亂?

#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 . 
+1

放心,沒有關鍵重複或異常行爲 – juanchopanza

+2

「myMap [1] [2] ='B'; //應該覆蓋以前的值」 - 爲什麼? –

+0

你爲什麼期望'myMap [1] [2] ='B''應該覆蓋'myMap [1] [1] ='A''? –

回答

-1

如果找不到,[]操作符會執行查找並插入。它將一個迭代器返回給定一個鍵的值。

因此,執行myMap [1]會將迭代器返回給地圖。

然後,在從myMap [1]返回的迭代器上調用myMap [1] [1]時,會將一個迭代器返回給char。我的地圖[1] [1] ='A'和myMap [1] [2] ='B'與我們的地圖[1] ='A'和我們的地圖[2] ='B'沒有什麼不同。 。

1

OK:

myMap[1][1] = 'A'; 

當這些功能被先叫,MYMAP是空的。所以,

myMap[1]  // XXXX 

創建在地圖索引條目:1.創建的東西本身就是一張地圖。然後:

myMap[1][1] = 'A'; 

在第二個包含的地圖中創建一個條目,併爲其分配「A」。

然後

 myMap[1][2] = 'B'; 

仰視XXX具有索引1(其本身是一個地圖)創建的映射條目,並增加了與鍵2和值B到第二入口中,包含地圖。

因此,我們在頂層地圖中有一個條目,第二個層次中有兩個條目。

1

你在想象一個沒有存在的問題。

沒有「重複密鑰」。

您的容器可由此顯現:

"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],您訪問內部地圖的關鍵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沒有影響。不需要「覆蓋」。

當你嵌套一個地圖時,它沒有什麼不同。