在基于范围的循环中迭代数组的一部分
Iterating over a part of an array in a range-based loop
是否有任何方法可以在c++ 11基于范围的循环中迭代数组的一部分?假设我有一个整型的someArray[10000000]
,但我只想迭代n
的前一个元素。因此,我不能简单地使用
for(auto elem: someArray) {//doStuff}
有没有办法限制循环的范围,同时仍然使用基于范围的好东西?
简单地将范围调整为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*/}
如果不为它编写自己的包装器,c++ 11就没有办法做到这一点。另一种选择是使用具有view::slice
的Range-V3 (查看):
#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实现。
使用c++ 20 std::span
即可。
for (auto elem : std::span(someArray).first(n))
std::cout << elem;
No。
在c++ 17中有一些东西将使这成为可能,例如std::range
和std::array_view
。
但在此之前,只要使用好的旧迭代器或索引for
,它将是最可读的:
for(auto i = 0u; i < n; ++i)
{
// do the stuffs on someArray[i]
}
基于范围的for循环遍历整个范围。你所能做的就是存储一个额外的索引,在每次查看时检查。
size_t index = 0;
for(auto elem: someArray)
{
//doStuff
if(index++ > n) break;
}
然而,我看不出这样做比普通的for循环有什么好处。
Ofc,您也可以在所需的子范围上使用std::for_each
,但我仍然更喜欢传统的for循环。
相关文章:
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 使用for循环检查数组中的重复项
- 并行用于C++17中数组索引范围内的循环
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 程序在遍历所有值之前离开循环. 数组的
- 在C++中循环数组时访问结构属性
- 如何创建循环数组
- 查找 for 循环数组C++中存在最大值和最小值的值
- 有没有办法在 c++ 中创建循环数组
- OpenMP-每个线程的循环/数组界限
- 循环数组 - 从最后一个跳到第一个,反之亦然
- 循环数组时显示'stack smashing detected abc2 terminated Aborted'
- 使用循环数组实现矢量
- 为什么在循环数组时会得到奇怪的整数
- 循环数组-超出值
- 用于循环数组赋值的C++.正在返回垃圾邮件
- 在RapidJson中循环数组并获取对象元素
- 对于循环数组迭代,if循环测试索引是否为真/假,计算结果不正确
- c++循环/数组
- 有没有一种方法可以简化这个c++整数循环数组?