【问题标题】:STL algorithm to delete all the objects in a container?STL算法删除容器中的所有对象?
【发布时间】:2011-09-29 20:23:47
【问题描述】:

是否有 STL 实用程序/算法可以对所有对象执行delete *the_object_iterator;?这样我就可以安全地clear()? STL 容器是 set,对象是指向使用 new 创建的 C++ 类的指针。

Boost 似乎是最好的解决方案。我的目标是避免对不可复制的类进行复制构造。

【问题讨论】:

标签: c++ boost stl stl-algorithm boost-ptr-container


【解决方案1】:

使用智能指针保存类指针

std::set<std::unique_ptr<MyClass> > mySet;

【讨论】:

  • 没有注意到它在 std:: 命名空间中
  • @unixman83: unique_ptr 是 C++11 中的新功能。如果你的编译器中还没有它,你可以使用boost::shared_ptr
【解决方案2】:

据我所知,没有删除所有对象的标准算法。但是,您可以轻松构建一个:

template< typename T > invoke_delete( T* ptr ){ delete ptr; }

std::for_each( set.begin(), set.end(), &invoke_delete< set_value_type > );

【讨论】:

  • std::for_each(set.begin(), set.end(), [](T* p){delete p;})(不是模板;自己替换T)。
  • @MSalters:确实,但那是 C++11,我碰巧知道 OP 正在使用 VC++9。
【解决方案3】:

Boost 指针容器是要走的路。

它们不仅存储动态分配的对象。但是对象可以作为引用访问,这使得在对象上使用标准算法变得更加容易。

boost::ptr_set<MyClass>   setData;

setData.insert(new MyClass);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多