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 << " ";
        }
    }
}
4

2 回答 2

2

我认为您的问题出在这一行:

Ensemble e = o[akey];

您正在为突变创建一个本地,而不是通过引用捕获地图中的左值。因此,在那之后您对 e 所做的任何更改都将在 e 超出范围时被丢弃。

于 2013-04-26T14:40:39.763 回答
1

In setup,e是中的对象的副本o
当您修改它时,您不会修改o.

要修复,请使用参考

Ensemble& e = o[akey];

这将使e引用相同的东西o[akey]而不是副本。

于 2013-04-26T14:44:05.750 回答