【问题标题】:How to iterate over c++ vector and operate on two values at a time using the range-v3 library?如何使用 range-v3 库迭代 c++ 向量并一次对两个值进行操作?
【发布时间】:2023-03-19 01:08:01
【问题描述】:

假设我有一个数字向量:

std::vector< int > v{ 1, 2, 3, 4 };

我想遍历向量并一次操作两个;也就是我要操作:

  • (1,2),
  • (2,3),和
  • (3,4)

我知道有一种方法可以使用 Eric Neibler 的 range-v3 库(预定在 C++20 中)来执行此操作,但我不记得命令的确切顺序。


我可以使用迭代器来做到这一点

for( auto begin = v.begin(); begin != (v.end()-1); begin++ ){
  // Do something with *begin and *(begin+1)
}

使用 range-v3 库会使它更加优雅和可读。我只是不记得命令是什么。

【问题讨论】:

  • @Mureinik 这可以解决问题,但比我发布(然后更新)的迭代器示例要复杂得多。
  • 我认为您正在寻找的 range-v3 术语是 sliding
  • @chris 是的 sliding 是术语。把它变成一个答案,我会给你功劳。

标签: c++ range-v3


【解决方案1】:

在 Eric Niebler 的库中,这称为滑动视图 (live example):

using namespace ranges;
std::vector< int > v{ 1, 2, 3, 4 };

for (const auto& p : v | views::sliding(2)) {
    std::cout << p[0] << ' ' << p[1] << '\n';
}

我不认为 C++20 中包含开箱即用的特定视图,但我相信它很有可能在未来出现。不幸的是,zip_viewhad to be cut from P1035,所以通过zip 的“规范”实现(用自身压缩范围减去第一个元素)可能也会涉及更多。

【讨论】:

    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 2018-12-10
    • 2020-08-08
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    相关资源
    最近更新 更多