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