2016-07-22 11 views
-2

C++マップをどのように反復処理しますか?たとえば

map<string, Person*> family; 
family["Bill"] = new Person(); 
family["Jill"] = new Person(); 

... 

// vvv does not work vvv 
for (Person* person: family) 
    delete person; 

私はすべてのポインタにメモリを解放するためにマップを介し用-eachループをやろうとしています。これはベクターでは機能しますが、マップでは機能しません。どうすればこれを達成できますか?

+2

に減少しあなたのタイトルを検索エンジンに入力すれば、たくさんの方法が見つかるでしょう。 –

+0

'std :: map'の' value_type'が何であるか調べて、 'auto'を使ってください。それがあなたのやり方です。 – LogicStuff

+2

なぜあなたはあなたのマップに生ポインタではなくスマートポインタを保持させるのですか?その後、マップをクリアするだけで、スマートポインタはリソースを解放します。 –

答えて

1
for(auto const& pair : family) 
{ 
    cout << pair.first << " represented by object at " << (void*)pair.second << "\n"; 
} 

ループを使用してオブジェクトを削除する代わりに、動的に割り当てられたオブジェクトへのポインタではなく、オブジェクトを直接格納することを検討してください。

ここでは、すべてのPersonのオブジェクトを削除し、そのマップエントリを削除する一つの方法です:

while(not family.empty()) 
{ 
    auto const it = family.begin(); 
    delete it->first; 
    family.erase(it); 
} 

あなたは(オブジェクトを動的に割り当てられていないポインタ)Personオブジェクトを格納する代わりに、場合場合、これは

family.clear(); 
+0

単純な 'delete pair.second;'で十分でしょうか? –

+0

@ CoffeeMaker:そのポインタは後で参照されない限り、コピーされません。それを確実にする1つの方法は、そのマップエントリを削除することです。しかし、レンジベースのループでは、すべてのメンバーを繰り返し処理することは簡単にできません。 –

+0

@ CoffeeMaker:私はいくつかの情報で答えを更新しました。 –

関連する問題