Verwenden des auto-in-Schleifen in c++
Ich eine Warnung erhalten signed/unsigned mismatch für den folgenden code:
auto n = a.size();
for (auto i = 0; i < n; i++) {
}
Das problem ist, dass durch die Zuordnung von 0 bis i
es wird int
eher als size_t
.
Also, was ist besser:
size_t n = a.size();
for (size_t i = 0; i < n; i++) {
}
oder so:
auto n = a.size();
for (size_t i = 0; i < n; i++) {
}
oder haben Sie vielleicht eine bessere Lösung? Ich mag die erste mehr, weil
es ist etwas mehr im Einklang, es benutzt nur size_t
anstatt beide size_t
und auto
für den gleichen Zweck.
- wie wäre
auto i = 0u
? - Wie wäre es mit einem int-wenn Sie einen index in der Schleife? Mit einem unsigned index kann man böse sehr schnell. E. g.
i < n - 1
ist falsch, wenni
undn
sind unsigniert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer range-based-loop könnte eine saubere Lösung:
Hier
i
ist einconst
Referenz auf ein element des Containersa
.Andernfalls müssen Sie den index, oder, wenn Sie nicht wollen, um eine Schleife über den gesamten Bereich, Sie können die Art, mit
decltype(a.size())
.decltype
version ist, dass Sie den index, wenn Sie es brauchen. Bearbeitete ich die Antwort das klar zu machen.decltype(n) i = 0
wäre kürzer und übersichtlicher, nicht wahr?n
in meiner Antwort. Es war gemeint zu seinn
-weniger.a.size()
durch eineconst int n
zum Beispiel.for(auto i = decltype(n){0}; i < n; i++)
Updates, Falldecltype(a.size()) i = 0;
zusize_t i = 0;
? In der Praxis ist das nichtsize_t
immer das Recht, einen index-Typ? Haben die Menschen wirklich gefunden Fällen, wo Sie hattesize_t i
und änderungen in einem container-interface, so dasssize_t
nicht mehr funktioniert, und Sie möchten (aus einem Wartbarkeit Perspektive), die Sie benutzt hatte, eine mehr abstrakte Art, wiedecltype(a.size()) i = 0;
? Mirsize_t
ist präziser und klarer-und container-index-Typen ändern sich nie.detlype
ist nicht ganz klar. Leidersize_t
nicht garantiert werden, das Recht geben, da sonst der Container nicht brauchen, um zu definieren, einesize_type
. Also ich würde es in generischen code, wenn ich wollen zu sein sicher, dass Sie den richtigen Typ. Aber ich erinnere mich nicht, hatte zu tun, dass so weit...Je nachdem, was Sie tun wollen innerhalb der Schleife und den Fähigkeiten der compiler die range-basierte for-Schleife könnte eine bessere Lösung sein.
Alle Ihre vorgestellten Lösungen sind nicht schlecht in den meisten Situationen, mit kleinen unterschieden
Deine erste Lösung ist eigentlich noch schlimmer Wahl, und das ist genau das, was der compiler dir sagt.
Zweite Lösung besser ist, aber wenn Sie wollen vermeiden, direkt Definition von Typen für Einfachheit oder irgendwann in der Zukunft ändern, können Sie Folgendes tun:
Diese Weise binden Sie die
i
undn
Typen immer zueinander passen.Wenn Sie die richtige wörtliche, Sie in Ordnung sein würde: 0-HE. auto sieht ein literal vom Typ int, das ist die Art von ich. Fügen Sie die U-und es wird ein unsigned int-literal statt. Ansonsten, solltest du Gebrauch davon machen wollen, decltype, wie andere vorgeschlagen haben, vor allem, da sizeof(size_t) kann größer als sizeof(int) (es ist auf Windows, OS X, etc. bei Ausführung im 64-bit long mode).
sizeof(0U)
immersizeof(size_t)
nach der standard?auto i= 0U
, und die Einschränkung bei der Verwendung. @ChronoKitsune und @Flexo zeigen, es ist ein gültige, aber nicht optimale Lösung für den OP. Sauberer alsdecltype(a.size()) i=0
im trivial-code.Zur Diskussion:
Beachten Sie, dass für Arten, die kleiner als
int
, der Abzug Ergebnis erweitert, umint
genannt (integer promotion).Versucht werden, die const-korrekt wenn möglich, Schreibe ich normalerweise:
Es ist nicht sehr prägnant, aber es ist klar, dass Sie wollen eine variable initialisiert auf 0 von
n
's geben (undn
istconst
).Hier ein einfaches & sauberere Lösung, damit es funktioniert.
Mit unsigned Typen würde ein problem darstellen, im Falle von Ausdrücken wie den folgenden:
Schlage ich zwei Optionen statt. Die erste (Editors choice):
und wenn Sie sind in Ordnung, mit einer Art, die in der Größe größer ist als
size_t
:...ist wahrscheinlich die sauberste Lösung, wenn Sie benötigen, um Zugriff auf den index, ebenso wie das eigentliche element.
Update:
Wäre ein workaround für die Richard Smiths Kommentar, obwohl es nicht so aussieht, dass mehr sauber.
auto
Erklärung, in der Sie deklariert mehrere Variablen, dieauto
abgeleitet wird unabhängig für jede variable, und der code ist schlecht-gebildet, wenn die abgeleiteten Typen sind nicht das gleiche.