Gemeinsame Nutzung
Die Methode zum Durchlaufen von STL-Containern in C++ ist normalerweise:
#include <iostream>
#include <vector>
int main() {
std::vector<int> arr = {
1, 2, 3};
for (auto it = arr.begin(); it != arr.end(); ++it)
{
std::cout << *it << std::endl;
}
return 0;
}
Der obige Code muss auf den Iterator achten und außerdem den Anfang und das Ende des Containers anzeigen. Zum Schreiben nicht geeignet. C++11 unterstützt bereichsbasierte for-Schleifen. wie folgt
Bereichsbasierte C++11-for-Schleife
Eine bereichsbasierte for-Schleife in C++11 sieht folgendermaßen aus:
#include <iostream>
#include <vector>
int main() {
std::vector<int> arr = {
1, 2, 3};
for (auto n : arr)
{
std::cout << n << std::endl;
}
return 0;
}
Sie können Referenzen auch verwenden, um den Wert eines Containers zu ändern:
#include <iostream>
#include <vector>
int main() {
std::vector<int> arr = {
1, 2, 3};
for (auto& n : arr)
{
n++;
}
//n的值为2,3,4
return 0;
}
Kartencontainer unterstützen außerdem:
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<std::string, int> mp = {
{
"1",1}, {
"2", 2}, {
"3", 3} };
for (auto& n : mp)
{
std::cout << n.first << " -> " << n.second << std::endl;
}
return 0;
}
Beachten
Bereichsbasierte for-Schleifen unterstützen jedoch nicht das Ändern des Containers während der Schleife:
Beispiel:
#include <iostream>
#include <vector>
int main() {
std::vector<int> arr = {
1, 2, 3 };
for (auto n : arr)
{
std::cout << n << std::endl;
arr.push_back(4);//修改arr
}
return 0;
}
Laufergebnisse:
Der Hauptgrund ist, dass die obige for-Schleife den Iterator zwar nicht explizit sieht, aber tatsächlich der Verwendung des Iterators zum Durchlaufen der Werte des Containers entspricht. Wenn wir das Containerobjekt während der Schleife ändern, ändert sich der Iterator wird geändert, was zu einer anschließenden Durchquerung führt und die Werte verwechselt werden.