您的位置:首页 > 编程语言 > C语言/C++

对包含指针的容器使用remove要特别小心

2016-08-08 15:21 246 查看
#include <iostream>
#include <algorithm>
#include <map>
#include <iterator>
#include <functional>
#include <sstream>
#include <vector>
using namespace std;
class Widget
{
private:
int weight;
public:
Widget()
{

};
Widget(int val);
Widget& operator=(int val);
friend ostream& operator<<(ostream &os,Widget w);
bool isCertified();
};
Widget::Widget(int val)
{
weight=val;
}
Widget& Widget::operator=(int val)
{
this->weight=val;
return *this;
}
ostream& operator<<(ostream &os,Widget w)
{
os<<w.weight;
return os;
}
bool Widget::isCertified()
{
return this->weight>=10;
}
class Derefence
{
public:
template<typename T>
const T& operator()(const T *w)
{
return *w;
}
};
void delAndNullifyUncertified(Widget* &w)
{
if(!w->isCertified())
{
delete w;
w=nullptr;
}
}
int main()
{
vector<Widget*> vec;
for(int i=1;i<=10;i++)
{
vec.push_back(new Widget(2*i+1));
}
//涉及到指针的erase-remove可能会造成内存泄漏
//vec.erase(remove_if(vec.begin(),vec.end(),not1(mem_fun(&Widget::isCertified))),vec.end());

//先删除不合格的数据,把指针置空
for_each(vec.begin(),vec.end(),delAndNullifyUncertified);
vec.erase(remove(vec.begin(),vec.end(),static_cast<Widget*>(0)),vec.end());
transform(vec.begin(),vec.end(),ostream_iterator<Widget>(cout," "),Derefence());
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  STL C++
相关文章推荐