Range-v3 view :: sliding(n)返回元组(如果在编译时已知n)

时间:2018-10-04 13:32:45

标签: c++ range-v3

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 :(得分:2)

假设这并非您的初衷,但是您可以编写如下内容:

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

否则,我不知道如何设置编译时大小的范围

答案 1 :(得分:2)

对于zipDEMO)中的所有range,您可以drop(range, i)i一起[1,n)

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,这将很快变得难看,并且几乎可以肯定这不是最佳选择,但是比编写自己的视图适配器要简单得多。