我的第一个问题是,迭代特定类型的整个可能值范围的最佳方法是什么?似乎没有真正干净的方法来实现这一目标。
答案 0 :(得分:3)
对于无符号整数类型,
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++;
}
答案 1 :(得分:3)
对于整数类型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 ++函数可以公开它。
答案 2 :(得分:1)
通过首先转换为具有更大尺寸的更大类型,可以完成对小类型的迭代。简单。 (注意,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
如果你想迭代一个大型(长长或无长长),我不得不想知道你在做什么,因为这需要四百年左右的时间。简单地迭代,更不用说做任何东西(假设3.0GHz单核处理器)。使用世界上最快的超级计算机天河-2迭代64位范围需要大约12天。