shared_ptr的容器,但使用原始指针进行迭代

Sea*_*nch 6 c++ iterator

我有一个类,其中包含一个包含boost::shared_ptrs另一个类的对象的列表.

允许访问列表返回原始指针中的元素的类成员函数.为了保持一致性,我还希望能够使用原始指针而不是shared_ptrs进行迭代.因此,当我取消引用列表迭代器时,我想获得原始指针,而不是shared_ptr.

我假设我需要为此编写一个自定义迭代器.它是否正确?如果是这样,有人能指出我正确的方向 - 我以前从未这样做过.

And*_*ard 5

这是使用Boost transform_iterator的选项:

#include <list>
#include <boost/iterator/transform_iterator.hpp>
#include <tr1/memory>
#include <tr1/functional>

using std::list;
using std::tr1::shared_ptr;
using boost::transform_iterator;
using boost::make_transform_iterator;
using std::tr1::mem_fn;
using std::tr1::function;

struct Foo {};

struct Bar
{
  typedef shared_ptr< Foo > Ptr;
  typedef list< Ptr > List;
  typedef function< Foo* (Ptr) > Functor;
  typedef transform_iterator< Functor, List::iterator > Iterator;

  Iterator begin()
  {
    return make_transform_iterator( fooptrs.begin(), mem_fn( &Ptr::get ) );
  }

  Iterator end()
  {
    return make_transform_iterator( fooptrs.end(), mem_fn( &Ptr::get ) );
  }

  List fooptrs;
};
Run Code Online (Sandbox Code Playgroud)

C++ 11可以很容易地消除function包装器,但我没有编译器方便测试它.Iterator如果你看到了需要,你也可以隐藏使用类型擦除的具体类型(我认为Adobe any_iterator为此提供了一个免费的类模板.)

  • +1,如果获取引用而不是指针是可以接受的(我不明白它为什么不应该),Boost也附带[`indirect_iterator <>`](http://www.boost.org/libs /iterator/doc/indirect_iterator.html). (2认同)