如何使用 range-v3 库迭代 C++ 向量并一次对两个值进行操作?
How to iterate over c++ vector and operate on two values at a time using the range-v3 library?
假设我有一个数字向量:
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 库会使它更加优雅和可读。我只是不记得命令是什么了。
在 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_view
had to be cut from P1035,因此通过 zip
的 "canonical" 实现(压缩范围本身减去第一个元素)可能也会涉及更多。
假设我有一个数字向量:
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 库会使它更加优雅和可读。我只是不记得命令是什么了。
在 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_view
had to be cut from P1035,因此通过 zip
的 "canonical" 实现(压缩范围本身减去第一个元素)可能也会涉及更多。