0

リストの配列をデータメンバーとして宣言したクラスがあります。

list <int> **listOfNodes;

次のように、クラスのコンストラクターでリストへのポインター用のスペースを割り当てました (ここで、「v」は必要なリストの数で、引数としてコンストラクターに渡されます)。

listOfNodes=new list<int>* [v];
for (int i = 0; i < v; ++i)
{
    list<int> temp;
    listOfNodes[i]=&temp;  //declaring a new list and making the list pointer point to it
}

これで、関数内に次のコードがあり、ユーザーからの入力を取得して対応するリストに追加します。たとえば、ユーザーが 2 5 を入力した場合、新しいエントリ 5 をインデックス 2 のリスト、つまり listOfNodes[2] が指すリストに push_back する必要があります。

int u,v;
cin>>u>>v;
(*(listOfNodes[u])).push_back(v);

しかし、どういうわけか私のコードは実行時にクラッシュします。誰かが私が間違っているかもしれないことを指摘してください。

4

2 に答える 2

2
for (int i = 0; i < v; ++i)
{
    list<int> temp;
    listOfNodes[i]=&temp;  
} // <- each temp is destructed here.

あなたのtempリストは自動的に割り当てられます。つまり、ループ スコープの外に出ると、それらは破棄されます。現在、listOfNodes[i]破壊されたメモリを指しています(コンパイラは毎回同じアドレスにtempを割り当て続けるため、おそらくそれらは同じ場所を指していますが、それでも無効です)。

代わりに次のようにする必要があります

for (int i = 0; i < v; ++i)
{
    listOfNodes[i] = new list<int>;  
}

deleteそして、動的に割り当てられたメモリを忘れないでください。おそらく、リストのリスト/ベクトルを使用するか、代わりにスマートポインターのリストを使用する必要があります。

于 2013-05-05T10:24:57.837 に答える
2

C++ コンテナー (リスト、ベクター、セットなど) と C コンテナー (プレーン配列) を混在させないでください。多数のリストを保持したい場合は、ベクトルを使用します。

std::vector<std::vector<std::list<int>>> nodes;

それ以外の

std::list<int>** listOfNodes;

リストのインスタンスを手動で追跡するのは非常に面倒です (まさにあなたが経験したことです)。std::arrayそのため、リスト インスタンスの処理はvector (または、状況に応じてより適切であると思われるもの) に任せてください。

于 2013-05-05T10:38:38.387 に答える