gpt4 book ai didi

c++ - boost range adapter 类似于 transformed 可以访问相邻元素

转载 作者:太空宇宙 更新时间:2023-11-04 11:58:59 25 4
gpt4 key购买 nike

我想制作一个由给定范围的相邻值转换的范围。有没有办法做到这一点?因此,我想制作一个在下面的代码中描述的 adjacent_transformed。

class Func{
public:
typedef int result_type;

int operator()(int a, int b, int c) {
return a+b+c;
}

};

int main(){
vector<int> v{1,1,1,1,1};
auto rng = make_iterator_range( next(v.begin(), prev(v.end()) ) | adjacent_transformed( Func() );
// rng shoud be {3, 3, 3}
}

另一个简单的问题:将 Func() 的右值传递给范围适配器 boost::adaptors::transformed 是否安全?据我测试,它按预期工作。如果安全,是否将 Func() 复制到 transformed 中?那么,Func()复制成本高怎么办?

抱歉,如果这不是一个相关的问题,但我不够熟练,无法理解 boost 范围的内部结构。

最佳答案

你可以使用这样的东西。我认为应该对其进行调整,但它确实有效。

template<typename Iterator, typename Functor>
class iterator : public boost::iterator_adaptor<
iterator<Iterator, Functor>,
Iterator,
typename std::iterator_traits<Iterator>::value_type,
boost::forward_traversal_tag,
typename std::iterator_traits<Iterator>::value_type,
typename std::iterator_traits<Iterator>::difference_type
>, private Functor
{
typedef boost::iterator_adaptor<
iterator<Iterator, Functor>,
Iterator,
typename std::iterator_traits<Iterator>::value_type,
boost::forward_traversal_tag,
typename std::iterator_traits<Iterator>::value_type,
typename std::iterator_traits<Iterator>::difference_type
> base_t;
public:
friend class boost::iterator_core_access;

iterator(Iterator current, Functor fnc):
base_t(current),
Functor(fnc)
{
}

typename std::iterator_traits<Iterator>::value_type dereference() const
{
Iterator i = this->base();
const Functor& fnc = *this;
return fnc(*boost::prior(i), *i, *boost::next(i));
}
};

template<typename Iter, typename Func>
iterator<Iter, Func> make_iterator(Iter i, Func f)
{
return iterator<Iter, Func>(i, f);
}

template<typename F, typename R>
struct trans_range : public boost::iterator_range<
iterator<typename boost::range_iterator<R>::type,
F>>
{
typedef boost::iterator_range<
iterator<typename boost::range_iterator<R>::type,
F>> base_t;
trans_range(F f, R& r) :
base_t(make_iterator(boost::begin(r), f), make_iterator(boost::end(r), f))
{
}
};

template< class T >
struct holder
{
T val;
holder( T t ) : val(t)
{ }
};

template<typename T>
struct trans_holder : holder<T>
{
trans_holder(T r) : holder<T>(r) { }
};

template< template<class> class Holder >
struct forwarder
{
template< class T >
Holder<T> operator()( T t ) const
{
return Holder<T>(t);
}
};

template<typename R, typename F>
inline trans_range<F, R> operator |(R range, const trans_holder<F>& f)
{
return trans_range<F, R>(f.val, range);
}

forwarder<trans_holder> transformed = forwarder<trans_holder>();

example

关于c++ - boost range adapter 类似于 transformed 可以访问相邻元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14930445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com