清除地图和删除内容的最简洁的方法是什么?
What is the most concise way to clear a map and delete contents?
我有一个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();
无论如何,请考虑使用智能指针,而不是通过原始指针、new
和delete
执行手动内存管理。这样就可以避免这类问题。
我不认为你的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; }
(我认为。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 将多个值与同一变量进行比较时'!='运算符最简洁的方法是什么?
- 确定程序本身是否具有对文件的特定访问权限的最简洁的方法是什么
- 访问双元素集合中的另一个元素的简洁语法是什么?
- 清除地图和删除内容的最简洁的方法是什么?
- 将空范围传递给接受一对迭代器的函数的干净/简洁的方法是什么?