我試圖在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 << " ";
}
}
}
將'Ensemble e = o [akey];'改成'Ensemble&e = o [akey];'。通過參考你將修改o [key]。現在你正在修改我認爲的o [key]的副本。 – 2013-04-26 14:40:52