首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Range-v3视图::滑动(N)返回元组(如果n在编译时已知)

Range-v3视图::滑动(N)返回元组(如果n在编译时已知)
EN

Stack Overflow用户
提问于 2018-10-04 13:32:44
回答 2查看 628关注 0票数 4
代码语言:javascript
复制
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>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-04 14:01:04

假设这不是您所想的那样,但您可以编写如下内容:

代码语言:javascript
复制
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;
    }
}

否则,我不知道如何确定编译时大小的范围。

票数 2
EN

Stack Overflow用户

发布于 2018-10-04 15:30:12

您可以将zipdrop(range, i) for all i in [1,n) (DEMO)一起使用:

代码语言:javascript
复制
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来说,这很快就会变得丑陋起来,而且几乎肯定不是最优的,但比编写自己的视图适配器要简单得多。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52648067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档