C ++ 11 Bereichsbasierte For-Loop-Effizienz "const auto & amp; i" versus "auto i"
In C++11, kann ich Durchlaufen einige container wie so:
for(auto i : vec){
std::cout << i << std::endl;
}
Aber ich weiß, dass dies unnötig - unnötigda ich nur ab und zu drucken die Werte von vec
- macht eine Kopie (BEARBEITEN: jedes element von) vec
so dass ich stattdessen tun könnte:
for(auto &i : vec){
std::cout << i << std::endl;
}
Aber ich möchte sicherstellen, dass die Werte der vec
sind nie geändert und befolgen, const-correctness, so dass ich tun kann:
for(const auto &i : vec){
std::cout << i << std::endl;
}
Also meine Frage ist: Wenn ich nur ab und zu Aussehen auf die Werte einiger container, würde nicht die Letzte Schleife (const auto &i
) immer bevorzugt werden aufgrund der erhöhten effieciency, ohne ein extra-Kopie (BEARBEITEN: jedes element von) vec
?
Ich habe ein Programm, das ich entwickle, in denen ich überlege mir diese änderung ganz, da der Wirkungsgrad entscheidend ist, es (der Grund, warum ich mit C++ in der Faust).
InformationsquelleAutor der Frage user2052561 | 2013-06-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja. Der gleiche Grund, wenn Sie immer nur Lesen, ein argument, das man machen die parameter
const&
.Denen sind Ihre "Vorgaben". Wenn
T
ist ein fundamentaler Typ (eingebaut), obwohl Sie in der Regel nur wiederconst T
(keine Referenz) für die zu Lesen, weil eine Kopie billiger ist als aliasing.InformationsquelleAutor der Antwort GManNickG
Vorstellen, wenn der Vektor enthält strings. Lange strings. 5000, lange Zeichenfolgen. Kopieren Sie unnötig und Sie am Ende mit einem schön geschrieben for-Schleife, die ist schrecklich ineffizient.
Stellen Sie sicher, dass Ihr code folgt Ihrer Absicht. Wenn Sie nicht brauchen, eine Kopie innerhalb der Schleife, nicht stellen.
Referenz & wie oben vorgeschlagen, oder Iteratoren.
InformationsquelleAutor der Antwort Visiedo