C++ <array> at-Funktion
Unter allen Möglichkeiten, auf Array-Elemente zuzugreifen,atist die sicherste, weil sieGrenzenprüfung bietet。
atist eine Memberfunktion von Container-Klassen, die verwendet wird, umdas Element an der angegebenen Position zurückzugebenund dabei eine Grenzenprüfung durchzuführen. Wenn der Index außerhalb der Grenzen liegt, wirftstd::out_of_rangeeine Ausnahme.
atimplementiert sicheren Elementzugriff, sodass Sie Fehler außerhalb der Grenzen zur Laufzeit abfangen und behandeln können.
Wortdefinitionen: atbedeutet "an Position", d. h., ruft das Element an der angegebenen Position ab.
Grundlegende Syntax und Parameter
atist eine Memberfunktion von Containerklassen, daher müssen Sie zuerst ein Containerobjekt haben und dann den Punktoperator verwenden., um sie aufzurufen.
Syntaxformat
reference at(size_type pos); const_reference at(size_type pos) const;
Parameterbeschreibung
- Parameter:
pos- Typ:
size_type(ein vorzeichenloser Ganzzahltyp, normalerweisesize_t) - Beschreibung: Die Position (der Index) des Elements, auf das zugegriffen werden soll. Der Index beginnt bei 0, und der maximal gültige Index ist
size() - 1。
- Typ:
Funktionsbeschreibung
- Rückgabewert: gibt das Element an der angegebenen Position zurückReferenz. Wenn der Container ein const-Container ist, wird eine const-Referenz zurückgegeben.
- Wirkung: Gibt das Element an der angegebenen Position zurück. Wenn der Index außerhalb des gültigen Bereichs liegt (
pos >= size()), wird es eine Ausnahme werfenstd::out_of_rangeeine Ausnahme. - Unterschied zu operator[]:
atführt eine Bereichsprüfung durch,operator[]führt keine Bereichsprüfung durch (das Verhalten außerhalb der Grenzen ist undefiniert).
Beispiel
Lass es uns anhand einer Reihe von Beispielen von einfach bis komplex gründlich meistern.atVerwendung.
Beispiel 1: Grundlegende Verwendung - Zugriff auf Elemente
Beispiel
#include <array>
#include <stdexcept>
int main() {
// 1. Ein Array erstellen und initialisieren
std::array<int, 5> numbers = {10, 20, 30, 40, 50};
std::cout << "Die Größe des Arrays ist: " << numbers.size() << std::endl;
// 2. Verwende at, um auf Elemente zuzugreifen
std::cout << Erstes Element (at(0)): << numbers.at(0) << std::endl;
std::cout << Zweites Element (at(1)): << numbers.at(1) << std::endl;
std::cout << Drittes Element (at(2)): << numbers.at(2) << std::endl;
std::cout << Letztes Element (at(4)): << numbers.at(4) << std::endl;
// 3. Verwende eine Schleife, um auf alle Elemente zuzugreifen
std::cout << "Alle Elemente: ";
for(size_t i = 0; i < numbers.size(); ++i) {
std::cout << numbers.at(i) << " ";
}
std::cout << std::endl;
return 0;
}
Erwartete Ausgabe:
array的大小是: 5 第一个元素 (at(0)): 10 第二个元素 (at(1)): 20 第三个元素 (at(2)): 30 最后一个元素 (at(4)): 50 所有元素: 10 20 30 40 50
Codeanalyse:
numbers.at(0)Gibt das erste Element zurück10(Indizes beginnen bei 0).numbers.at(4)gibt das letzte Element zurück50(weilsize()ist 5, gültige Indizes sind 0-4).- mit Schleifen und
atkann sicher alle Elemente durchlaufen.
Beispiel 2: Abfangen von Out-of-Bounds-Ausnahmen
atDer Hauptvorteil ist, dass es Ausnahmen auslösen kann, sodass wir Fehler außerhalb der Grenzen behandeln können.
Beispiel
#include <array>
#include <stdexcept>
int main() {
std::array<int, 3> numbers = {10, 20, 30};
// Versuch, auf eine Position außerhalb der Grenzen zuzugreifen
try {
std::cout << Versuch, auf at(10) zuzugreifen... << std::endl;
int value = numbers.at(10); // Dies wird eine Ausnahme auslösen
std::cout << Wert: << value << std::endl;
}
catch(const std::out_of_range& e) {
std::cout << Abgefangene Ausnahme: << e.what() << std::endl;
}
// Normaler Zugriff
try {
std::cout << Zugriff auf (2): << numbers.at(2) << std::endl;
}
catch(const std::out_of_range& e) {
std::cout << Abgefangene Ausnahme: << e.what() << std::endl;
}
return 0;
}
Erwartete Ausgabe:
尝试访问 at(10)... 捕获到异常: array::at: __pos (which is 10) >= _Nm (which is 3) 访问 at(2): 30
Codeanalyse:
- Beim Zugriff auf
at(10)wenn, weil der Index außerhalb des gültigen Bereichs liegt, eine Ausnahme ausgelöst wirdstd::out_of_rangeeine Ausnahme. catch(const std::out_of_range& e)Ausnahme abfangen,e.what()gibt die Beschreibung der Ausnahme zurück.- normaler Indexzugriff löst keine Ausnahmen aus.
Beispiel 3: Ändern des Werts eines Elements
atEs gibt eine Referenz zurück, sodass damit der Wert des Elements geändert werden kann.
Beispiel
#include <array>
int main() {
std::array<int, 3> numbers = {10, 20, 30};
std::cout << "Vor der Änderung: ";
for(size_t i = 0; i < numbers.size(); ++i) {
std::cout << numbers.at(i) << " ";
}
std::cout << std::endl;
// Verwende at(), um eine Referenz zu erhalten und das Element zu ändern
numbers.at(0) = 100;
numbers.at(1) = 200;
numbers.at(2) = 300;
std::cout << "Nach der Änderung: ";
for(size_t i = 0; i < numbers.size(); ++i) {
std::cout << numbers.at(i) << " ";
}
std::cout << std::endl;
return 0;
}
Erwartete Ausgabe:
修改前: 10 20 30 修改后: 100 200 300
Codeanalyse:
numbers.at(0) = 100;Durch die Referenz wurde der Wert des ersten Elements geändert.- Dies zeigt
at()gibt eine modifizierbare lvalue-Referenz zurück.
Weitere Erweiterungen