C++ <array> at-Funktion

C++ Container-Klasse <array>


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 istsize() - 1。

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 <iostream>
#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:

  1. numbers.at(0)Gibt das erste Element zurück10(Indizes beginnen bei 0).
  2. numbers.at(4)gibt das letzte Element zurück50(weilsize()ist 5, gültige Indizes sind 0-4).
  3. mit Schleifen undatkann 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 <iostream>
#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 aufat(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 <iostream>
#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 zeigtat()gibt eine modifizierbare lvalue-Referenz zurück.

C++ Container-Klasse <array>

Weitere Erweiterungen