Ja, sie sind gleichwertig. Die Standard-Garantien in 6.5.4:
Für eine bereichsbasierte für Anweisung der Form
für (für Bereichsdeklaration: Ausdruck) Anweisung
let range-init gleichwertig sein der Ausdruck durch Klammern (Ausdruck) umgeben
und für eine bereichsbasierte für Anweisung der Form
für (für Strecken-Erklärung: verspannt-init-Liste) statement
Lassen Sie range-init äquivalent zur braced-init-Liste sein. In jedem Fall ist eine bereichsbasierte für Aussage gleichwertig
{
auto && __range = range-init;
for (auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin) {
for-range-declaration = *__begin;
statement
}
}
wo __range, __begin und __end Variablen für Exposition nur definiert sind, und _RangeT ist die Art des Ausdrucks, und BEGIN expr und Endausdruck werden wie folgt bestimmt: des Ausdrucks, und beginnen-expr und Endausdruck werden wie folgt bestimmt:
- wenn _RangeT ein Array-Typ ist, beginnen-expr und Endausdruck sind __range und __range + __bound, wobei __bound die Array-Grenze ist.Wenn _RangeT ein Array unbekannter Größe oder ein Array unvollständigen Typs ist, ist das Programm schlecht formatiert.
- wenn _RangeT ein Klassentyp ist, der unqualifizierte-IDs beginnen und endet, sind im Bereich der Klasse nachgeschlagen _RangeT wie von Klasse Member-Access-Lookup (3.4.5), und wenn entweder (oder beides) findet mindestens eine Deklaration, begin- expr und end-expr sind __range.begin() bzw. __range.end();
- sonst beginnen begin-expr und end-expr begin (_ range) und end ( _range) bzw. wo begin und end mit argumentabhängiger Suche (3.4.2) nachgeschlagen werden. Zum Zweck dieses Namens-Lookups ist Namespace std ein zugehöriger Namespace.
Obwohl Ihre Frage zu Karte ist ein bisschen unsinnig. Wenn es sich um eine geordnete Karte handelt und Sie die Karte richtig durchlaufen, sind sie gleichwertig. Wenn es sich um eine ungeordnete Karte handelt, macht Ihre Frage keinen Sinn.
Sie könnten sicherlich ein bisschen eine unnötige Kopie optimieren, indem Sie 'auto &' anstelle von 'auto' –