Index außerhalb des Bereichs
Was passiert, wenn du nach einem Index fragst, an dem es kein Element gibt? Zum Beispiel nach dem Index 3 in einem Vektor mit drei Elementen:
std::vector<int> zahlen = {10, 20, 30};
std::cout << zahlen[3] << std::endl;Das Programm gibt eine sinnlose Zahl aus, zum Beispiel:
44225Eckige Klammern prüfen nicht, ob der Index zum Vektor gehört. Das Programm liest einfach, was im Speicher hinter dem Ende des Vektors liegt, ähnlich wie wenn du eine Variable ausgibst, der du keinen Startwert gegeben hast. Beim nächsten Lauf kann eine andere Zahl herauskommen, und liegt der Index weit hinter dem Ende, kann das Programm sogar abstürzen. Nichts warnt dich vor dem Fehler, deshalb ist er schwer zu finden. Negative Indizes, die du vielleicht aus anderen Sprachen kennst, funktionieren in C++ ebenfalls nicht: zahlen[-1] liegt auch außerhalb des Vektors.
Die Methode at() ist sicherer. zahlen.at(1) tut dasselbe wie zahlen[1], prüft aber zuerst den Index. Liegt der Index außerhalb des Vektors, bricht das Programm mit einem Fehler ab:
std::vector<int> zahlen = {10, 20, 30};
std::cout << zahlen.at(1) << std::endl;
std::cout << zahlen.at(3) << std::endl;
std::cout << "Ende" << std::endl;Das Programm gibt 20 aus und bricht ab. Der Text Ende wird nie ausgegeben. Stattdessen zeigt die Ausgabe eine rote Fehlermeldung, die out_of_range enthält. Du weißt sofort, dass ein Index falsch ist, und die zuletzt ausgegebene Zeile zeigt dir, wo das Programm stehen geblieben ist.
Auch ein Element kannst du mit at() ändern, genau wie mit eckigen Klammern: zahlen.at(0) = 15;
Eckige Klammern sind kürzer, und du wirst sie in Programmen öfter sehen. Wenn du dir bei einem Index nicht sicher bist, benutze at(). Der beste Schutz aber ist, deine Indizes richtig zu wählen: Das erste Element hat den Index 0, das letzte size() - 1.
So schreibst du es:
Anweisungen
- 1
Das Programm soll die Temperatur am Montag, dem ersten Tag der Woche, und am Sonntag, dem letzten, ausgeben. Führe es aus: Beide Temperaturen sind falsch. Korrigiere zuerst den Index für Montag, sodass die Ausgabe die Zeile
Montag: 18enthält. - 2
Ersetze für Sonntag
temperaturen[7]durchtemperaturen.at(7)und führe das Programm aus. Es bricht mit einem Fehler ab, weil der Index 7 außerhalb des Vektors liegt. Korrigiere dann den Index inat(): Sonntag ist das letzte Element, sein Index ist alsotemperaturen.size() - 1. Das Programm gibt dannSonntag: 20aus.