0

以下のコードでは、出力を次のように表示する代わりに、

0 -> 1 2
1 -> 2 3
..
..
99 ->100 101

私は次のように出力を得ています、

0 -> 100 101
1 -> 100 101
...
99 -> 100 101

この問題を解決する方法を教えてください。正確にどこが間違っているのでしょうか? 私が見つけたデバッグ中に、最初の反復でそれが保存されます

0 -> 1 2

2 回目の反復では、次のように更新されます。

0 -> 2 3
1 -> 2 3

なんで?

class abc{
    public:
        int x, y;
};
std::map<int, abc*> MAP;
int main()
{
    abc *ab;
    ab = new abc();
    int i = 0;
    for(i = 0; i < 100; i++)
    {
        ab->x = i + 1;
        ab->y = i + 2;
        MAP.insert(std::pair<int, abc*>(i, ab));
    }
    map<int, abc*>::iterator it;
    for(it = MAP.begin(); it != MAP.end(); it++)
    {
        cout << it->first << "->" << it->second->x <<" "<< it->second->y << endl;
    }
    system("pause");
    return 0;
}
4

3 に答える 3

7
ab = new abc();

abc割り当てられているのは 1 つだけです。そして、ループ内でそれを変更し続け、それへのポインターを再挿入します。したがってsecond、マップのすべての値は同じシングルを指していabcます。


abc *ab;
// ab = new abc();

//
//
for(i = 0; i < 100; i++)
{

    ab = new abc();
    ^^^^^^^^^^^^^^
    ab->x = i + 1;
    ab->y = i + 2;
    MAP.insert(std::pair<int, abc*>(i, ab));
}
于 2013-04-18T17:37:14.627 に答える
1

あなたは常に同じアドレスを参照しています:

abc *ab;
ab = new abc();
于 2013-04-18T17:39:19.447 に答える
1
abc *ab;
ab = new abc();
int i = 0;
for(i = 0; i < 100; i++)
{
    ab->x = i + 1;
    ab->y = i + 2;
    MAP.insert(std::pair<int, abc*>(i, ab));
}

クラスオブジェクトへのポインタをマップに格納するためです。forループ内で上記を行うと、新しいオブジェクトをマップに保存するのではなく、指定されたオブジェクトの値を変更し続けます。

次のことを試してください。

abc *ab;
int i = 0;
for(i = 0; i < 100; i++)
{

    ab = new abc();
    ab->x = i + 1;
    ab->y = i + 2;
    MAP.insert(std::pair<int, abc*>(i, ab));
}
于 2013-04-18T17:40:54.957 に答える