C++ <array> begin / end-Funktion

C++ Container-Klasse <array>


beginundendEs ist die wichtigste Iteratorfunktion in array, sie wird verwendet, umdie begin- und end-Iteratoren des Containers zu erhalten.。

beginundendsind Memberfunktionen der Container-Klasse:

  • begingibt einen Iterator auf das erste Element des Containers zurückIterator
  • endGibt einen Iterator auf die Position nach dem letzten Element des Containers zurück.Iterator(Sentinel-Iterator)

Diese beiden Funktionen sind die Grundlage der Algorithmen der C++-Standardbibliothek und der bereichsbasierten for-Schleifen.

Wortdefinitionen: beginBezeichnet "begin",endBezeichnet "end".


Grundlegende Syntax und Parameter

beginundendSie sind Memberfunktionen der Container-Klasse, und ihr Aufruf erfordert keine Argumente.

Syntaxformat

iterator begin() noexcept;
const_iterator begin() const noexcept;

iterator end() noexcept;
const_iterator end() const noexcept;

Parameterbeschreibung

  • Parameter: Keine Parameter
    • Diese Funktionen akzeptieren keine Parameter.

Funktionsbeschreibung

  • Rückgabewert:
    • begin()Gibt einen Iterator auf das erste Element zurück.
    • end()Gibt einen Iterator (Sentinel) auf die Position nach dem letzten Element zurück.
  • Effekt: Der zurückgegebene Iterator kann verwendet werden, um den Container zu durchlaufen oder mit Algorithmen zu arbeiten.
  • Hinweis: end()Der zurückgegebene Iterator zeigt auf eine "virtuelle" Position, kann nicht dereferenziert werden und kann nur zum Vergleich verwendet werden.

Beispiel

Lassen Sie uns anhand einer Reihe von Beispielen gründlich meisternbeginundendVerwendung.

Beispiel 1: Grundlegende Verwendung - Durchlaufen von Containern

Beispiel

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> numbers = {10, 20, 30, 40, 50};

    // Mit einem Iterator durchlaufen
    std::cout << "Mit einem Iterator durchlaufen: ";
    for(auto it = numbers.begin(); it != numbers.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

Erwartete Ausgabe:

使用迭代器遍历: 10 20 30 40 50

Codeanalyse:

  1. numbers.begin()Gibt einen Iterator zurück, der auf das erste Element (10) zeigt.
  2. numbers.end()Gibt einen Iterator auf die Position nach dem letzten Element zurück.
  3. Schleifenbedingungit != numbers.end()Stellt das Durchlaufen aller Elemente sicher.

Beispiel 2: Bereichsbasierte for-Schleife

Die in C++11 eingeführte bereichsbasierte for-Schleife verwendet internbeginundend。

Beispiel

#include <iostream>
#include <array>
#include <string>

int main() {
    std::array<std::string, 3> names = {"Alice", "Bob", "Charlie"};

    // Bereichsbasierte for-Schleife (verwendet intern begin/end)
    std::cout << "Bereichsbasierte for-Schleife verwenden: ";
    for(const auto& name : names) {
        std::cout << name << " ";
    }
    std::cout << std::endl;

    return 0;
}

Erwartete Ausgabe:

使用范围 for 循环: Alice Bob Charlie

Codeanalyse:

  • Die bereichsbasierte for-Schleife ist eine prägnante Möglichkeit, Iteratoren zu verwenden.
  • Der Compiler ruft automatisch aufbegin()undend()。

Beispiel 3: Verwendung von STL-Algorithmen

Algorithmen der Standardbibliothek müssen Iteratoren verwenden, um Bereiche anzugeben.

Beispiel

#include <iostream>
#include <array>
#include <algorithm>

int main() {
    std::array<int, 6> numbers = {5, 2, 8, 1, 9, 3};

    // Sortieren
    std::sort(numbers.begin(), numbers.end());

    std::cout << "Nach dem Sortieren: ";
    for(int n : numbers) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    // Element finden
    auto it = std::find(numbers.begin(), numbers.end(), 8);
    if(it != numbers.end()) {
        std::cout << "Gefundenes Element: " << *it << std::endl;
    }

    return 0;
}

Erwartete Ausgabe:

排序后: 1 2 3 5 8 9
找到元素: 8

Codeanalyse:

  • std::sort(begin, end)Verwenden Sie Iteratoren, um den Sortierbereich anzugeben.
  • std::find(begin, end, value)Verwenden Sie Iteratoren, um den Suchbereich anzugeben.

Beispiel 4: Reverse-Iteratoren

NutzungrbeginundrendKann den Container in umgekehrter Reihenfolge durchlaufen.

Beispiel

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> numbers = {1, 2, 3, 4, 5};

    // Vorwärtsdurchlauf
    std::cout << "Vorwärts: ";
    for(auto it = numbers.begin(); it != numbers.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // Rückwärtsdurchlauf (mit rbegin/rend)
    std::cout << "Rückwärts: ";
    for(auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

Erwartete Ausgabe:

正向: 1 2 3 4 5
反向: 5 4 3 2 1

Codeanalyse:

  • rbegin()Gibt einen Reverse-Iterator zurück, der auf das letzte Element zeigt.
  • rend()Gibt einen Reverse-Iterator zurück, der auf die Position vor dem ersten Element zeigt.

Beispiel 5: Iterator-Arithmetik

Iteratoren unterstützen arithmetische Operationen, wodurch schnelle Sprünge an eine angegebene Position möglich sind.

Beispiel

#include <iostream>
#include <array>

int main() {
    std::array<int, 7> numbers = {10, 20, 30, 40, 50, 60, 70};

    // Drittes Element abrufen (Index 2)
    auto it = numbers.begin() + 2;
    std::cout << "begin() + 2 = " << *it << std::endl;

    // Berechne den Abstand zwischen zwei Iteratoren
    auto first = numbers.begin();
    auto last = numbers.end();
    auto distance = last - first;
    std::cout << "Containergröße (Abstand): " << distance << std::endl;

    // Mittleres Element abrufen
    auto mid = numbers.begin() + (numbers.size() / 2);
    std::cout << "Mittleres Element: " << *mid << std::endl;

    return 0;
}

Erwartete Ausgabe:

begin() + 2 = 30
容器大小(距离): 7
中间元素: 40

Codeanalyse:

  • Iterator-Unterstützung+、-Arithmetische Operationen usw.
  • Sie könnenend() - begin()Containergröße berechnen.

Beispiel 6: Verwenden von Iteratoren zum Ändern von Elementen

Der Iterator gibt eine Referenz zurück, die zum Ändern von Elementen verwendet werden kann.

Beispiel

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> numbers = {1, 2, 3, 4, 5};

    std::cout << "Vor der Änderung: ";
    for(int n : numbers) std::cout << n << " ";
    std::cout << std::endl;

    // Alle Elemente mithilfe von Iteratoren mit 2 multiplizieren
    for(auto it = numbers.begin(); it != numbers.end(); ++it) {
        *it *= 2;
    }

    std::cout << "Nach der Änderung: ";
    for(int n : numbers) std::cout << n << " ";
    std::cout << std::endl;

    return 0;
}

Erwartete Ausgabe:

修改前: 1 2 3 4 5
修改后: 2 4 6 8 10

Codeanalyse:

  • Iterator-Dereferenzierung (*it) gibt eine Referenz auf das Element zurück.
  • Sie können diese Referenz direkt ändern, um den Wert des Elements zu ändern.

C++ Container-Klasse <array>

Weitere Erweiterungen