使用带有boost :: transform_iterator的状态保持函子

时间:2012-08-01 07:39:50

标签: c++ boost iterator

我有仿函数,如下所示:

 struct Functor{
    //Global statistics for all objects seen;

    Statistics stats;

    Object operator( const Object & obj) const
    {
          //Copy Object
          Object tmp = obj;
          compute(tmp);
          return tmp;
    }


    void compute( Object & obj );
       //Compute on Object & store in Object 
       :
       :
       stats += obj; <---compute stats about the object itself.
    }
 }

仿函数以boost::transform_iterator与以下方式一起使用:

SomeDataStructure ds;

boost::transform_iterator< Functor, SomeDataStructure::iterator  > iBegin,iEnd;

iBegin = boost::make_transform_iterator( ds.begin(),Functor() );
iEnd   = boost::make_transform_iterator( ds.end(),Functor() );

AnotherMethod(iBegin,iEnd);

关于上面的代码我有两个问题:

1)Functor按值传递给迭代器。因此,即使我使用以下代码,我也无法从仿函数中提取任何值:

iBegin.functor().stats;

有更好的方法吗?

2)仿函数通常填充Object类型的不完整对象。即计算对象的属性并将其存储回对象中。 operator()需要来自transform_iterator类的const对象。目前,我制作了该对象的副本并填充该对象并将其返回。我想摆脱这个不必要的副本,那么有什么方法可以做到这一点吗?

PS:也欢迎替代解决方案。

1 个答案:

答案 0 :(得分:1)

关于问题1)您可以使用boost::ref C ++ 11 std::ref

boost::transform_iterator< std::reference_wrapper<Functor>, 
                           SomeDataStructure::iterator  > iBegin,iEnd;

auto myFunctor = std::ref(Functor());
iBegin = boost::make_transform_iterator( ds.begin(), myFunctor );
iEnd   = boost::make_transform_iterator( ds.end(), myFunctor );

关于2),如果你不能通过非const引用,最好通过值传递并避免自己做一个临时的:

Object operator(Object obj) const
{
      compute(obj);
      return obj;
}

这允许编译器执行复制省略并且可以减少复制。有关详细信息,请参阅this article