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

时间:2015-12-07 10:06:51

标签: c++ c++11 mingw mingw-w64

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

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

代码:

#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如何从一开始而不是零?我原以为它的行为与here所描述的一样。

3 个答案:

答案 0 :(得分:4)

我认为您还没有正确理解语法

for (auto i  : x)

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

答案 1 :(得分:0)

&#34; I&#34;是数组中的实际值而不是索引。因此它在第一列中打印x [1]到x [5],在第二列中打印1到5。要访问这些值,只需打印&#34; i&#34;。

答案 2 :(得分:0)

for (auto i : x)

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

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