在基于范围的循环中迭代数组的一部分

时间:2015-10-21 19:36:23

标签: c++ arrays c++11

有没有办法在C ++ 11基于范围的循环中迭代一部分数组?假设我有一个int someArray[10000000],但我只想迭代第一个n元素。因此,我不能简单地使用

for(auto elem: someArray) {//doStuff}

在使用基于范围的好东西的同时限制循环范围的任何方法?

4 个答案:

答案 0 :(得分:4)

只需将范围调整为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*/}

答案 1 :(得分:2)

没有。不符合现行标准。

C ++ 17正在制定一些可以实现这一目标的东西,例如: brew linkstd::range

但在那之前,只需使用好的旧迭代器或索引std::array_view,它将是最具可读性的:<​​/ p>

for

答案 2 :(得分:2)

没有为自己编写自己的包装器,就没有C ++ 11方法可以做到这一点。另一种选择可能是使用Range-V3 view::slice see it live ):

#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 ;
}

如果另一方面C ++ 14可用,那么GSL array_view将是一个可行的选择:

gsl::array_view<int> av(arr+3,3) ;

for( auto &item : av )
{
    std::cout << item << ", " ;
}
std::cout << std::endl ;

gsl-lite提供了一个适用于C ++ 11的最小GSL实现。

答案 3 :(得分:0)

基于范围的for循环遍历整个范围。你可以做的是存储你在每个外观中检查的附加索引。

response.body

然而,我没有看到你通过常规for循环获得的东西。

Ofc,您也可以在所需的子范围内使用size_t index = 0; for(auto elem: someArray) { //doStuff if(index++ > n) break; } ,但我仍然更喜欢传统的for循环。

相关问题