C++ 反向 'for' 循环

C++ reverse 'for' loop

我有一个向量:

std::vector<int> vec = {1, 2, 3};

我想制作一个反向 for 循环。它有效,当我写:

for(int i = vec.size() - 1; i >= 0; --i) {
    std::cout << i << std::endl; // 2, 1, 0
}

但是如果我写:

for(size_t i = vec.size() - 1; i >= 0; --i) {
    std::cout << i << std::endl;
}

但是当我写的时候它们都有效:

for(int i = 0; i < vec.size() - 1; ++i) {
    std::cout << i << std::endl; // 1, 2, 3
}

// Or
for(size_t i = 0; i < vec.size() - 1; ++i) {
    std::cout << i << std::endl; // 1, 2, 3
}

为什么我在使用 size_t 时会得到错误的向量大小?

我认为转换有问题。

问题是 size_t 是一个 无符号 整数,即它只能有正值。当您为无符号类型减少 0 时,会发生下溢,结果通常是该类型可表示的最大整数,例如18446744073709223794 在你的情况下。最后,对于任何无符号类型,i >= 0 的检查始终为真,您的循环将永远不会终止。

让编译器告诉你哪里出了问题!

如果您在启用警告的情况下编译您的程序,编译器会tell您像这样:

<source>: In function 'int main()':

7:43: warning: comparison of unsigned expression in '>= 0' is always true [-Wtype-limits]
    7 |     for(std::size_t i = vec.size() - 1; i >= 0; --i) {
      |                                         ~~^~~~

这是为什么?这是因为std::size_t is an unsigned type in C++; it only represents non-negative numbers. Read more about turning on warnings and why it's important:

那么,我们应该如何反向迭代?

我决定将我的回答拆分成一个单独的问题,独立于 OP 的错误。请.