Range-v3 view :: slide (n) для возврата кортежа (если n известно во время компиляции) - PullRequest
0 голосов
/ 04 октября 2018
std::vector v{1,2,3};

for (auto&& t : v | view::sliding(2)) {
    auto&& [first, second] = t;  // error - t is a range
}

есть ли подобное представление в range-v3, которое может вернуть кортеж?

что-то вроде sliding<2>

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Вы можете zip вместе range с drop(range, i) для всех i в [1,n) ( DEMO ):

std::vector v{1,2,3};

namespace view = ranges::view;
for (auto [first, second] : view::zip(v, view::drop(v, 1))) {
     std::cout << first << ", " << second << '\n';
}

Это быстро уродливо для больших n и почти наверняка неоптимально, но гораздо проще, чем написание собственного адаптера представления.

0 голосов
/ 04 октября 2018

Предполагая, что это не совсем то, что вы имели в виду, но вы можете написать что-то вроде:

template <typename T, size_t... I>
auto helper(T&& rng, std::index_sequence<I...>) {
   return std::make_tuple(rng[I]...);
}

int main() {
   std::vector v{1,2,3,4,5};
   for (auto&& t : v | ranges::view::sliding(3)) {
      auto&& [first, second, third] = helper(t, std::make_index_sequence<3>{});
      std::cout << first << ", " << second << ", " << third << std::endl;
    }
}

В противном случае, я не знаю, как сделать размером во время компиляции диапазоны.

...