有没有办法在C ++ 11基于范围的循环中迭代一部分数组?假设我有一个int someArray[10000000]
,但我只想迭代第一个n
元素。因此,我不能简单地使用
for(auto elem: someArray) {//doStuff}
在使用基于范围的好东西的同时限制循环范围的任何方法?
答案 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 link
和std::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循环。