0

我有一个 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();

会工作。如果我错了,请纠正我。

4

2 回答 2

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. 这样你就可以避免这类问题。

于 2013-05-03T17:16:40.560 回答
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 )

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

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

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

于 2013-05-03T17:38:54.517 回答