Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
地图数据结构混乱的地图 我试图在C++中设置一个地图结构图,但不能使它像预期的那样工作。我编写了这个示例程序来说明这个问题。如果这看起来很复杂,请原谅,但我想尽可能保留这个案子_C++ - Fatal编程技术网

地图数据结构混乱的地图 我试图在C++中设置一个地图结构图,但不能使它像预期的那样工作。我编写了这个示例程序来说明这个问题。如果这看起来很复杂,请原谅,但我想尽可能保留这个案子

地图数据结构混乱的地图 我试图在C++中设置一个地图结构图,但不能使它像预期的那样工作。我编写了这个示例程序来说明这个问题。如果这看起来很复杂,请原谅,但我想尽可能保留这个案子,c++,C++,因此,当前打印输出为:L1,大小=0 我所期待的是: L1, size 1 L2, 4 似乎二级地图没有正确建立,可能是范围问题,但我不能完全弄清楚。计划如下: // So the map is // AKEY -> { BKEY -> [ SegPair, SegPair .... ] } #include <map> #include <utility> #include <iostream> #include <vector

因此,当前打印输出为:
L1,大小=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 << " ";
        }
    }
}
//所以地图是
//AKEY->{BKEY->[SegPair,SegPair….]}
#包括
#包括
#包括
#包括
typedef std::字符串AKEY;
typedef std::字符串BKEY;
typedef std::pair SegPair;
typedef std::vector SegVec;
typedef std::map集合;
typedef std::映射Oracle;
使用std::string;
Oracle o=Oracle();
无效设置(字符串akey、字符串bkey、整数x、整数y){
自动位置=o.find(akey);
如果(pos==o.end()){
o[akey]=集合();
}
合奏e=o[akey];
自动定位2=e.find(bkey);
if(pos2==e.end()){
e[bkey]=SegVec();
}
segp(x,y);
e[bkey]。推回(p);
}
内部主(空){
设置(“L1”、“L2”、3、4);
for(自动it=o.begin();it!=o.end();it++){
std::cout优先;
合奏e=它->秒;

我想你的问题在于这一行:

Ensemble e = o[akey];

您正在创建一个局部变量,而不是通过引用捕获图中的左值以进行变异。因此,在该点之后对e所做的任何更改都将在e超出范围时被丢弃。

设置中
e
o
中对象的副本
当您修改它时,您不会在
o
中修改任何内容

若要修复,请使用引用:


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

修改'emble e=o[akey];`to'emble&e=o[akey];`。通过引用,您将修改o[key]。我想现在您正在修改o[key]的副本。@Oliver
emble&e=o[akey];
是的,谢谢这两件事(Scotty和gonzhitaao)指出了问题和解决方案。
Ensemble& e = o[akey];