Может ли диапазон повышения превратить соседние элементы в диапазон?

Если у меня есть диапазон, и я хочу преобразовать соседние пары, есть ли повышение
Адаптер дальности, чтобы сделать это?

например

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);
}

Однако я не знаю, как определить тип возвращаемого значения | оператор. Если я могу сделать это, то адаптер почти решен.

1

Решение

Вы можете поддерживать фиктивную переменную

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

Другие решения

Нет. Но вы можете использовать алгоритм диапазона:

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector