在基于范围的循环中遍历数组的一部分

Str*_*tfw 3 c++ arrays c++11

有什么方法可以在基于C ++ 11范围的循环中仅对数组的一部分进行迭代吗?说我有一个int,someArray[10000000]但是我只想迭代第一个n元素。因此,我不能简单地使用

for(auto elem: someArray) {//doStuff}
Run Code Online (Sandbox Code Playgroud)

在仍然使用基于范围的功能时,有什么方法可以限制循环的范围?

Sha*_*our 5

如果不为其编写自己的包装器,则没有 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 实现。


Jon*_*ely 5

只需将范围更改为其他类型,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)

  • 为什么编写通常有效而不是总是有效的代码? (5认同)
  • 为什么不使用size_t作为尺寸呢? (3认同)