为什么我的基于范围的 for 循环适用于某些数据类型,但不适用于其他数据类型?

-1 c++ iterator char stdvector range-based-loop

我尝试了一些基于范围的 for 循环来了解这个概念,对于整数数组和向量,它工作得很好。但对于字符向量,我的编译器不会给出任何错误消息或所需的结果,只是一行红点。这是我的代码:

\n
#include <iostream>\n#include <vector>\nusing namespace std;\nint main(){\n    vector<char> myVector {\'a\', \'b\', \'c\', \'d\'};\n    myVector.push_back(\'e\');\n    for (auto i : myVector){\n        cout << myVector[i] << endl;\n    }\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

什么\xe2\x80\x99s错了?我找不到任何东西。当我用整数替换字符时,效果很好。

\n

Vla*_*cow 6

在这个循环中:

for (auto i : myVector){
    cout << myVector[i] << endl;
}
Run Code Online (Sandbox Code Playgroud)

该变量的i类型为char。它是向量中存储的每个元素的副本。因此,要输出向量的元素,您需要编写:

for (auto i : myVector){
    cout << i << endl;
}
Run Code Online (Sandbox Code Playgroud)

如果不深入细节,您可能会想象这个基于范围的 for 循环如下所示:

for ( auto first = myVector.begin(), last = myVector.end(); first != last; ++first )
{
    auto i = *first;
    cout << i << endl;
}
Run Code Online (Sandbox Code Playgroud)

请注意,在 C++ 20 中,基于范围的 for 循环的构造被放大了。例如你可以写

for ( size_t j = 0; auto i : myVector){
    std::cout << j++ << ": " << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,程序输出将是

0: a
1: b
2: c
3: d
4: e
Run Code Online (Sandbox Code Playgroud)