在整数类型的整个范围内进行迭代
Iterating over the full range of an integer type
我的第一个问题是,迭代特定类型的所有可能值的最佳方式是什么?似乎没有真正干净的方法来实现这一点。
对于无符号整数类型,
unsigned x = 0;
do {
// something with x
} while (++x > 0);
你可以这样做,因为无符号积分类型服从算术模2^n的定律。
对于一个有符号的积分类型,类似这样的东西会起作用,尽管它不那么干净:
int x = std::numeric_limits<int>::min();
while (true) {
// do something with x
if (x == std::numeric_limits<int>::max()) break;
x++;
}
对于整数类型T
,可以使用
const T i0 = std::numeric_limits<T>::min();
const T in = std::numeric_limits<T>::max();
for(T i=i0;i!=in;++i) do_something(i);
do_something(in);
浮点类型有点棘手。IEEE754定义了一个操作,允许您在任何给定值之上(或之下(步进到下一个可表示的数字,但据我所知,没有一个标准的C++函数来公开它。
对小类型的迭代可以通过首先转换为具有较大大小的较大类型来完成。容易的(注意,long long
几乎总是大于int
,但不能保证是。(
for(long long i = INT_MIN; i<=INT_MAX; ++i)
^^^^^^^^^
或者,将最后一个分离出来:
for(int i=INT_MIN; i<INT_MAX; ++i)
do_thing(i);
do_thing(INT_MAX); //get the last one
如果你想迭代一个大型类型(long-long或unsigned long-long(,我不得不想知道你在做什么,因为简单地迭代需要大约四百年的时间,更不用说用它们做任何事情了(假设3.0GHz单核处理器(。用世界上最快的超级计算机"天河二号"在64位范围内迭代大约需要12天。
相关文章:
- 在向量内的向量上迭代
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用基于范围的循环迭代矢量时出现问题
- 如何修复错误,迭代器未在此范围内声明,并且迭代器未命名类型'
- 您可以在一段时间内迭代向量
- 在数组内迭代,使用类似的方法,但得到不同的结果
- 有没有办法使用基于范围的迭代器来迭代对指针列表值的引用?
- 如何找出迭代器是否位于某个范围内
- 基于自定义范围的迭代器,用于矢量的模板向量
- 为什么 gcc-4.9.2 不能支持 std::string.insert(迭代器,范围)返回迭代器
- 基于自定义容器范围的迭代
- 有一个标准的算法可以在一个范围内迭代吗
- <algorithm>在同一输入迭代器范围内并排运行两个
- 在ref/cref范围内同时迭代
- 构造一个可以使用基于的范围进行迭代的对象
- 使用 boost 对多个 std 容器进行基于范围的迭代的概念问题
- 在多次迭代中创建随机大小(在特定范围内)的数组
- 5秒内迭代向量5
- 在整数类型的整个范围内进行迭代
- 列出超出范围的迭代器