C++ 使用大小索引按相反顺序枚举数组

C++ 使用大小索引按相反顺序枚举数组,c++,arrays,indexing,C++,Arrays,Indexing,假设我们需要按相反顺序打印大小为N的int数组: // 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 re

假设我们需要按相反顺序打印大小为
N
int
数组:

// 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];}
//错误,i未签名且始终>=0:
对于(size_t i=N-1;i>=0;--i){cout=0;--i){cout 0;--i){cout,自C++14以来:

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

for(auto-it=std::rbegin(data);it!=std::rend(data);+it){std::cout您可以简单地测试
i


size_t被定义为无符号整数,而无符号整数又被定义为具有模语义。因此,您的索引将从
N-1
下降到0,然后环绕到
numeric_limits::max()
,您可以将减量移动到“after”条件

for(size_t i = N; i > 0;) {
    --i;
    cout << data[i];
}
(大小i=N;i>0;)的
{
--一,;

如果我知道我至少要迭代一次,那么我可以在
时使用
do
/
。否则我倾向于基于一个进行计数并使用
数据[I-1]
。为什么“使用
大小
索引”通过iTreator?我建议更改代码,以便在循环中使用索引。因为我认为这是一个有效的问题,所以通常您确实需要索引。否则,使用迭代器或类似工具的有效建议会使您偏离真实问题。@ChrisDrew:对,我可以通过使用C语言并将代码更改为C。但现在已经太晚了。当您正在执行
i=N-1;
--i;
时,因此
i
将始终是正确的。这将像无限循环一样。@Himanshu不,这是有效的。相反,这个解决方案的问题是,有些人会认为它不起作用。我认为这段代码是正确的,它是相似的ar到我的上一个版本
i!=(size\u t)(-1)
但看起来更棘手。@MikeMB u r正确。我认为它可能适用于0,0,…在达到索引0之后。@Alex我会说它“看起来”比您的示例更简单,但正如本讨论所示,它可能更容易被误解,并且我会说您的版本可能更清楚地显示了意图。基本上,您要求读者理解其中的任何一个从有符号到无符号的c-cast做了什么,或者无符号int的下溢做了什么。最后,这可能取决于您更习惯使用哪种符号。
for(size_t i = N; i > 0;) {
    --i;
    cout << data[i];
}