基于范围的 for 循环从 1 而不是 0 开始?

Range based for loop starts at one instead of zero?

我刚刚开始使用基于范围的 for 循环来简化我在使用模板时的代码。我遇到了一个奇怪的错误,我不确定这是我遗漏的东西还是编译器出错了。我写了一段代码来说明我遇到的问题以及输出。这些如下所示。

注意: 我在 windows g++ (rev5, Built by MinGW-W64 project) 4.8.1 上使用 Mingw64 编译器,未使用 --std=c++11 标志进行优化编译。

代码:

#include <iostream>
#include <array>
#include <vector>

int  main()
{
    // Declares an array of size 5 and of type int and intialises.
    std::array<int,5> x = {1,2,3,4,5};
    std::vector<int> y = {1,2,3,4,5};

    // Prints each element
    std::cout << "Array:" << std::endl;
    std::cout << "x" << "\t" << "i" << std::endl;
    for (auto i  : x)
    {
        std::cout << x[i] << "\t" << i << std::endl;
    }

    std::cout << "Vector" << std::endl;
    std::cout << "y" << "\t" << "i" << std::endl;
    for (auto i : y)
    {
        std::cout << y[i] << "\t" << i << std::endl;
    }
    std::cin.get();
    std::cin.get();
    return 0;
}

输出:

Array:
x       i
2       1
3       2
4       3
5       4
0       5
Vector
y       i
2       1
3       2
4       3
5       4
1313429340      5

我假设向量和数组输出的最后一行是溢出,请注意 i 如何从 1 而不是 0 开始?我本以为它会像描述的那样表现 here.

我认为你没有正确理解语法

for (auto i  : x)

这里i不是数组的索引,它是向量x中的实际元素。 所以它正在正确地完成它的工作。

"i" 是数组中的实际值而不是索引。所以它在第一列中打印 x[1] 到 x[5],在第二列中打印 1 到 5。要访问这些值,只需打印 "i"。

for (auto i : x)

创建 x 中元素的副本以在 for 循环中使用。请改用迭代器按索引访问元素。

for (size_t i = 0; i < x.size(); i++) {
    std::cout << x[i] << "\t" << i << std::endl;
}