2013-04-26 142 views
1

我試圖在C++中設置映射結構映射,但無法使其按預期工作。我把這個樣本程序放在一起來說明這個問題。如果看起來有些複雜,請原諒這個爛攤子,但我希望儘可能保留這個案子。映射數據結構混淆映射

所以當前打印出來是:L1, size = 0 和我所期待的是一樣的東西:

L1, size 1 
    L2, 4 

這似乎是第二級地圖正確建立,也許一個範圍問題,但我不能完全弄清楚。該計劃是爲以下情況:

// So the map is 
// AKEY -> { BKEY -> [ SegPair, SegPair .... ] } 

#include <map> 
#include <utility> 
#include <iostream> 
#include <vector> 

typedef std::string AKEY; 
typedef std::string BKEY; 

typedef std::pair<int,int> SegPair; 
typedef std::vector<SegPair> SegVec; 
typedef std::map<BKEY, SegVec> Ensemble; 
typedef std::map<AKEY, Ensemble> Oracle; 

using std::string; 

Oracle o = Oracle(); 

void setup(string akey, string bkey, int x, int y) { 
    auto pos = o.find(akey); 
    if (pos == o.end()) { 
     o[akey] = Ensemble(); 
    } 

    Ensemble e = o[akey]; 

    auto pos2 = e.find(bkey); 
    if (pos2 == e.end()) { 
     e[bkey] = SegVec(); 
    } 

    SegPair p(x, y); 
    e[bkey].push_back(p); 
} 

int main(void) { 

    setup("L1", "L2", 3, 4); 

    for (auto it = o.begin(); it != o.end(); it++) { 
     std::cout << it->first; 
     Ensemble e = it->second; 
     std::cout << ", size = " << e.size() << "\n"; 
     for (auto it2 = e.begin(); it2 != e.end(); it2++) { 
      std::cout << "\t" << it2-> first << "\n"; 
      SegVec v = it2->second; 
      for (int i = 0; i < v.size(); i++) 
       std::cout<< v[i].second << " "; 
     } 
    } 
} 
+0

將'Ensemble e = o [akey];'改成'Ensemble&e = o [akey];'。通過參考你將修改o [key]。現在你正在修改我認爲的o [key]的副本。 – 2013-04-26 14:40:52

回答

2

我覺得你的問題是這一行:

Ensemble e = o[akey]; 

你創造一個地方,而不是引用捕獲左值在地圖中,突變。因此,在e點超出範圍後,您對e點所做的任何更改都會被丟棄。

+1

您可能想指出如何解決此問題。 – Dukeling 2013-04-26 14:42:03

+0

@Oliver'Ensemble&e = o [akey];' – gongzhitaao 2013-04-26 14:43:09

+0

是的,謝謝(Scotty和gonzhitaao)指出問題和解決方案。 – Oliver 2013-04-26 14:55:35

1

setupe是物體的在o一個拷貝
當您修改它時,您不會修改o中的任何內容。

要修復,使用參考

Ensemble& e = o[akey]; 

這將使e指的是同樣的事情o[akey]而不是複製。