【问题标题】:Can boost range transform adjacent elements in a range?提升范围可以转换范围内的相邻元素吗?
【发布时间】:2018-05-03 08:49:40
【问题描述】:

如果我有一个范围并且我想转换相邻的对,是否有提升 范围适配器来做到这一点?

例如

std::vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);

auto b = a 
   | boost::range::transformed([](int x, int y){return x+y;});

输出将是

3, 5

编辑

我已尝试使用范围适配器

    // Base class for holders
template< class T >
struct holder
{
    T val;
    holder( T t ) : val(t)
    { }
};


// Transform Adjacent

template <typename BinaryFunction> struct transformed_adjacent_holder 
    : holder
    {
    transformed_adjacent_holder(BinaryFunction fn) : holder<BinaryFunction>(fn)
};

template <typename BinaryFunction> transform_adjacent
   (BinaryFunction fn) 
   { return transformed_adjacent_holder<BinaryFunction>(fn); }

template< class InputRng, typename BinFunc>
inline auto Foo(const InputRng& r, const transformed_adjacent_holder<BinFunc> & f)
    -> boost::any_range
    < std::result_of(BinFunc)
    , boost::forward_traversal_tag
    , int
    , std::ptrdiff_t
    > 

{
    typedef boost::range_value<InputRng>::type T;
    T previous;
    auto unary = [&](T const & t) {auto tmp = f.val(previous, t); previous = t; return tmp; };
    return r | transformed(unary);
}

但是我不知道如何推断 | 运算符的返回类型。如果我能做到这一点,那么适配器几乎解决了。

【问题讨论】:

  • 没有boost::range::adjacent_differenced,类似于std::adjacent_difference,就像有boost::range::transformed(类似于std::transform

标签: c++ boost boost-range


【解决方案1】:

你可以维护一个虚拟变量

 int prev=0;
 auto b = a | transformed([&prev](int x){int what = x+prev;prev=x;return what;});

【讨论】:

    【解决方案2】:

    没有。但是你可以使用范围算法:

    Live On Wandbox

    #include <boost/range/algorithm.hpp>
    #include <boost/range/adaptors.hpp>
    #include <vector>
    #include <iostream>
    
    using namespace boost::adaptors;
    
    int main() {
        std::vector<int> a { 1,2,3 };
    
        auto n = a.size();
        if (n > 0) {
            auto out = std::ostream_iterator<int>(std::cout, "\n");
            boost::transform(a, a | sliced(1, n), out, [](int x, int y) { return x + y; });
        }
    }
    

    这使用了a 的二进制转换和自身的一部分。

    打印

    3
    5
    

    【讨论】:

    • 我知道算法版本,我自己实现了类似的东西。无论如何+1的答案。但是,作为适配器而不是算法,这将是非常好的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2017-10-30
    • 1970-01-01
    相关资源
    最近更新 更多