【问题标题】:Enumerating array in reverse order using size_t index使用 size_t 索引以相反的顺序枚举数组
【发布时间】:2015-01-29 05:30:50
【问题描述】:

假设我们需要以相反的顺序打印大小为Nint 数组:

// 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 给出(size_t)(-1) 是否有效或者这是未定义的?

【问题讨论】:

  • 如果我知道我将至少迭代一次然后我使用do / while。否则我倾向于从一开始计算并使用data[i - 1]
  • 为什么在迭代器上“使用size_t索引”?
  • 我建议更改代码以便在循环中使用索引。因为我认为这是一个有效的问题,所以通常你确实需要索引。否则,你会因为使用迭代器或类似工具的有效建议而偏离真正的问题。
  • @ChrisDrew:是的,我可以通过用 C 语言标记这个问题并将代码更改为 C 来防止这种侧向跟踪。但现在为时已晚。

标签: c++ arrays indexing


【解决方案1】:

C++14 起:

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

或者如果你可以使用 boost,你可以使用 boost::adaptors::reversed 和 for range。

【讨论】:

    【解决方案2】:

    您可以简单地测试i &lt; N

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

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

    【讨论】:

    • 正如你正在做的i = N-1;--i; 所以i &lt; N 将永远是真的。这就像无限循环。
    • @Himanshu 不,这行得通。相反,这个解决方案的问题是有些人会认为它不起作用。
    • 我觉得这段代码是对的,和我上一个版本i != (size_t)(-1)差不多,但是看起来比较棘手。
    • @MikeMB 你说得对。我想它可能会在 0,0,.. 达到索引 0 后工作。
    • @Alex 我会说它“看起来”比你的例子更简单,但是正如这个讨论所表明的那样,它可能更容易被误解,我会说你的版本可能更清楚地显示了意图。基本上,您需要读者了解从有符号到无符号的 c-cast 的作用或 unsigned int 的下溢的作用。最后可能取决于您更习惯哪种表示法。
    【解决方案3】:

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

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

    它不像转发循环那样优雅,但它可以工作。我们在 0 处中断,所以 i 永远不会换行。

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 2010-09-29
      • 1970-01-01
      • 2011-10-17
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      相关资源
      最近更新 更多