【问题标题】:What is the most concise way to clear a map and delete contents?清除地图和删除内容的最简洁方法是什么?
【发布时间】:2013-05-03 17:12:37
【问题描述】:

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

会起作用的。如果我错了,请纠正我。

【问题讨论】:

  • 你真的不应该将std::liststd::map 用于普通指针的集合。您应该使用旨在保存指针的集合或使用智能指针。如果您执行其中任何一项,您只需清空集合即可执行您想要的操作。
  • 这是别人的旧代码,但是,哪些集合被设计为使用指针?
  • 我支持 Sarien 的问题:“哪些集合设计为使用指针?”
  • @DavidSchwartz std::map 原始指针在导航中无处不在。 (当然,这里很明显map 应该管理指针,而`std::shared_ptr 可能是个好主意。)

标签: c++ list map stl


【解决方案1】:

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();

会起作用的。如果我错了,请纠正我。

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

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

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

【讨论】:

  • 我不得不将 lambda 更改为 [](std::pair p) { delete p.second; }。不知何故,VC10 不喜欢 decltype。
  • @Sarien:哦,那好吧。 VC10 怪事。您可能有一个typedef std::map<std::wstring, myThingy*> my_map;typedef decltype(myMap) my_map; 并将lambda 定义为[] (my_map::value_type const& p) { ... },它应该接受
【解决方案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的值类型是pair,不是 一个指针,所以你需要这样的东西:

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

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

【讨论】:

  • @Sarien 这并不是说我认为这不是一个好主意。我只是不确定确切的语法。阅读标准或某本书是一回事,尝试使用它是另一回事。
猜你喜欢
  • 2015-04-03
  • 2014-04-19
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
相关资源
最近更新 更多