清除地图和删除内容的最简洁方法是什么?

时间:2013-05-03 17:12:37

标签: c++ list map stl

我有一个std :: list和一个std :: map,我想要清空并在所有指针上调用delete。

在阅读this问题后,我将其用于std :: list:

mylist.remove_if([](myThingy* thingy) -> bool { delete thingy; return true; });

对于std :: map有什么类似的简洁吗?

请注意,我不能使用基于范围的for循环,因为我的编译器(VC10)不支持它。如果有可能我会假设

for(auto* thingy : myMap) { delete thingy; }
myMap.clear();

会奏效。如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:2)

  

对于std :: map有什么类似的简洁吗?

您可以这样做(假设您的thingy是映射值,而不是密钥):

for_each(myMap.begin(), myMap.end(), 
    [] (decltype(myMap)::value_type const& p) { delete p.second; });

myMap.clear();

关于基于范围的for循环:

  

如果有可能我会假设

for(auto* thingy : myMap) { delete thingy; }
myMap.clear();
     

会奏效。如果我错了,请纠正我。

或多或少。您仍然需要记住,地图的值实际上是 - 但您可以修复基于范围的for以保持这一点,是的:是的:

for (auto&& p : myMap) { delete p.second; }
myMap.clear();

无论如何,请考虑使用智能指针,而不是通过原始指针newdelete执行手动内存管理。这样你就可以避免这种问题。

答案 1 :(得分:2)

我认为你的remove_if解决方案不是一个好主意 其他类型。只需使用一个简单的循环(或foreach):

for ( auto current = myMap.begin(); current != myMap.end(); ++ current ) {
    delete current->second;
}
myMap.clear();

请注意,您无法执行delete current->first;这将 使地图中的键无效。除非你这样做 紧接着clear()(或正在破坏地图), 将已删除的指针设置为NULL。

关于你的第二个问题:

for ( auto* thingy : myMap )

肯定不会奏效。地图的值类型是一对,而不是 一个指针,所以你需要像:

for ( auto thingy : myMap ) { delete thingy.second; }

(我想。我也无法对此进行试验。)