有一个标准的算法可以在一个范围内迭代吗
Is There a Standard Algorithm to Iterate Over a Range?
我需要用范围内的每个int
调用lambda。有标准的算法可以做到这一点吗?
理想情况下等效:
for(auto i = 13; i < 42; ++i)[](int i){/*do something*/}(i);
没有内置,没有
您可以使用手工制作的迭代器和std::for_each
,或者使用Boost的计数迭代器来帮助您:
#include <boost/iterator/counting_iterator.hpp>
#include <algorithm>
#include <iostream>
int main()
{
std::for_each(
boost::counting_iterator<int>(13),
boost::counting_iterator<int>(42),
[](int i){ std::cout << i << ' '; }
);
}
输出:
13 14 15 16 17 18 19 20 21 22 23 24 25 27 28 30 31 32 33 34 35 36 37 38 39 40 41
(现场演示)
我不知道标准库中有什么可以像您所要求的那样按需生成一系列数字。但这可以通过使用Boost的几种不同方式来实现。
-
使用Boost.Range生成一个整数范围,并将其与范围版本的
for_each
一起使用boost::for_each(boost::irange(13, 42), [](int i){ std::cout << i << ' '; });
-
使用Boost.Iterator中的
boost::counting_iterator
并将其传递给std::for_each
std::for_each(boost::make_counting_iterator(13), boost::make_counting_iterator(42), [](int i){ std::cout << i << ' '; });
实时演示
正如其他答案所提到的,如果Boost是一个选项,那么有更好的方法可以做到这一点。如果没有,最好的方法是在最初的问题:
for(auto i = 13; i < 42; ++i)[](int i){/*do something*/}(i);
然而,未来是光明的,chris提到了N4128提案,该提案建议将范围与迭代器一起纳入标准。
现在草案仍处于早期状态,因此在确定如何使用之前需要进行大量澄清。但其中一个概念是,所有STL算法都将被重载,以采用view
s,这是一个薄包装器,提供对所包含元素的访问,但也是一个智能的结束位置。
尽管选择了一个更复杂的例子来展示view
的力量,但作者在动机和范围中的例子使用了iota
,这正是我们想要的:
int total = accumulate(view::iota(1) |
view::transform([](int x){return x*x;}) |
view::take(10), 0);
出于我们的目的,我们需要在for_each
算法中使用generate_n
:
for_each(view::generate_n(28,[]{static int i = 13; return i++;}),[](int i){/*do something*/});
这将导致generate_n
被调用28次(13+28=41),创建的view
将对这些数字进行迭代,将它们输入到for_each
中的原始lambda中。
chris建议对iota
进行修改,而不是generate_n
:iota(13, 41)
需要注意的是,无论使用什么,都必须有一个结束条件,因为视图都会延迟地调用生成器,直到不再请求任何项目为止。所以这个定义了一个无限循环。for_each(view::iota(10), [](int i){/*do something*/});
- 不计算一个范围内的完美数
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 检查IP是否在其他IP网络范围内,并查找下一个可用IP
- 从大范围内生成一个随机数,但从大范围的中间开始生成较小的范围
- 为什么C++找不到布尔运算符,当有一个!范围内的运算符?
- C :在一个范围内计数偶数 /奇数
- 如何创建一个结构的实例,当它不在范围内时,该实例将不会被删除
- 如果地图擦除范围内的第一个和最后一个相等,则是否删除该元素
- 是否可以在全球范围内声明一个提升线程
- 在一个范围内的阵列中找到三胞胎
- 如何检查一个范围内的值是否是另一个范围内的值的倍数
- 正在检查排序列表中是否有一个范围内的数字
- 有一个标准的算法可以在一个范围内迭代吗
- 在一个范围内生成不同的随机数
- 使用srand(time(0))猜测一个范围内的数字
- Qt QXYSeries和ChartView -修改悬停行为在一个范围内触发
- 在一个范围内查找素数的直观方法
- 一个范围内的成功随机数
- 如何在C++的另一个范围内使用局部变量
- 将十进制数保持在一个范围内