有什么方法可以在基于C ++ 11范围的循环中仅对数组的一部分进行迭代吗?说我有一个int,someArray[10000000]但是我只想迭代第一个n元素。因此,我不能简单地使用
for(auto elem: someArray) {//doStuff}
Run Code Online (Sandbox Code Playgroud)
在仍然使用基于范围的功能时,有什么方法可以限制循环的范围?
如果不为其编写自己的包装器,则没有 C++11 方法可以做到这一点。另一种选择是使用Range-V3,它具有view::slice(实时查看):
#include <iostream>
#include <range/v3/view.hpp>
int main() {
int arr[10] = {1,2,3,4,5,6,7,8,9,10} ;
using namespace ranges;
auto rng = arr | view::slice(3, 6);
for( auto &item : rng )
{
std::cout << item << ", " ;
}
std::cout << std::endl ;
}
Run Code Online (Sandbox Code Playgroud)
另一方面,如果 C++14 可用,那么GSL array_view将是一个可行的选择:
gsl::array_view<int> av(arr+3,3) ;
for( auto &item : av )
{
std::cout << item << ", " ;
}
std::cout << std::endl ;
Run Code Online (Sandbox Code Playgroud)
gsl-lite提供了在 C++11 中工作的最小 GSL 实现。
只需将范围更改为其他类型,begin()然后end()在其中做正确的事即可。
struct Slice {
int* arr;
size_t n;
int* begin() { return arr; }
int* end() { return arr + n; }
};
for(auto elem : Slice{someArray, 100}) {/*doStuff*/}
Run Code Online (Sandbox Code Playgroud)