Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:从“中的映射中删除值”;对于每一个“;环_C++_Stl_Map_Foreach_Function Pointers - Fatal编程技术网

C++ C++;:从“中的映射中删除值”;对于每一个“;环

C++ C++;:从“中的映射中删除值”;对于每一个“;环,c++,stl,map,foreach,function-pointers,C++,Stl,Map,Foreach,Function Pointers,对于std::vector v我可以通过调用 std::for_each(v.begin(), v.end(), (void(*)(void* a))operator delete); 现在,如果我有std::map m每次显式删除。在不从映射中删除条目的情况下删除p.second有什么用?将m.clear()做你想做的事吗?因为容器显然“拥有”指针对象,你可能需要使用Boost。这样,从映射中删除项目也会破坏指针对象。运算符delete不是delete,千万不要这样使用。@fuenfunda

对于
std::vector v我可以通过调用

std::for_each(v.begin(), v.end(), (void(*)(void* a))operator delete);
现在,如果我有
std::map m
是什么

std::for_each(m.begin(), m.end(), ???);

如果您使用的是C++11,则可以使用基于范围的

for(auto& pair : m) delete pair.second;
如果您使用的是C++11之前的标准,则可以使用函子:

struct delete_second {
  void operator()(std::pair<int, double*> p) { delete p.second; }
};

...

  std::for_each(m.begin(), m.end(), delete_second());
struct delete\u秒{
void操作符()(std::pair p){delete p.second;}
};
...
std::for_each(m.begin(),m.end(),delete_second());
使用C+11,您可以执行以下操作:
std::for_each(m.begin(),m.end(),[](std::pair p){delete p.second;})

不用麻烦了<代码>标准::地图
。无需手动
删除
,只需
清除()
地图即可。智能指针>每次显式删除。

在不从映射中删除条目的情况下删除p.second有什么用?

m.clear()
做你想做的事吗?因为容器显然“拥有”指针对象,你可能需要使用Boost。这样,从映射中删除项目也会破坏指针对象。
运算符delete
不是
delete
,千万不要这样使用。@fuenfundachtzig:0x1247182A
operator delete
operator new
相对应,它只处理原始内存的分配<代码>新建
/
删除
另外处理构造(他们通过
操作员新建
/
操作员删除
进行分配)-他们调用CTOR和DTOR,这是正确行为所必需的。您的第一个代码段之所以有效,是因为您使用了基本类型。例如,未调用dtor的示例:将lambda参数声明为引用可能是一个优势:
[](std::pair&p){…}
。我正在维护现有代码,因此更改类型并不容易。除此之外,我发现这个问题本身就很有趣。(最后我可以编写一个简单的for循环。)我同意这是最好的解决方案,但请注意,
clear()
的效果是将映射的
大小减少到0,这与OP的向量示例中指定的行为不完全匹配说在STL容器中使用auto_ptr是个糟糕的主意。独特的ptr比自动ptr好得多,但我认为在大多数情况下使用共享的ptr仍然更好