我刚开始使用基于范围的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所描述的一样。
答案 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;
}