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

What is the most concise way to clear a map and delete contents?

本文关键字:简洁 是什么 方法 地图 删除 清除      更新时间:2023-10-16

我有一个std::list和一个std::map,我想清空它们并对所有指针调用delete。

看完这个问题后,我将这个用于std::list:

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

对于std::map是否有类似的简洁语句?

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

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

是可行的。如果我说错了,请指正。

对于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执行手动内存管理。这样就可以避免这类问题。

我不认为你的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 )

肯定是行不通的。map的值类型是pair,而不是一个指针,所以你需要这样写:

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

(我认为。