使用size_t索引以相反的顺序枚举数组

时间:2014-12-01 08:41:04

标签: c++ arrays indexing

我们需要以相反的顺序打印大小为int的{​​{1}}数组:

N

使用// Wrong, i is unsigned and always >= 0: for(size_t i = N-1; i >= 0; --i){cout << data[i];} // Correct, but uses int instead of size_t: for(int i = N-1; i >= 0; --i){cout << data[i];} // Correct, but requires additional operation in the loop: for(size_t i = N; i > 0; --i){cout << data[i-1];} // Probably the best version, but less readable. // Is this well-defined behavior? for(size_t i = N-1; i != (size_t)(-1); --i){cout << data[i];} 索引进行此类枚举是否有更好的方法,并且循环中没有其他操作?

假设size_t给出(size_t)0 - 1或者这是未定义的,是否有效?

3 个答案:

答案 0 :(得分:2)

自C ++ 14:

for (auto it = std::rbegin(data); it != std::rend(data); ++it) { std::cout << *it; }

或者,如果您可以使用提升,则可以使用boost::adaptors::reversed和范围。

答案 1 :(得分:2)

您可以将减量移动到“条件”之后。

for(size_t i = N; i > 0;) {
    --i;
    cout << data[i];
}

它不像转发循环那样优雅,但它有效。我们在0处突破,因此i永远不会包裹。

答案 2 :(得分:1)

您只需测试i < N

size_t被定义为无符号整数,而后者又被定义为具有模数语义。因此,您的索引将从N-1降低到0,然后回绕到numeric_limits<size_t>::max() i<N不再适用。 举一个完整的例子:

for(size_t i = N-1; i < N; --i){cout << data[i];}