2016-07-22 110 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; 

我試圖通過地圖做for-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:只要該指針以後從未被引用,甚至不會被複制。一種確保刪除該地圖條目的方法。但是在迭代遍歷所有成員的基於範圍的循環中,你無法輕鬆做到這一點。 –

+0

@CoffeeMaker:我用更多的信息更新了答案。 –