迭代整数类型的整个范围

时间:2014-05-23 21:21:05

标签: c++ iteration

我的第一个问题是,迭代特定类型的整个可能值范围的最佳方法是什么?似乎没有真正干净的方法来实现这一目标。

3 个答案:

答案 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天。