C++ <vector> begin / end-Funktion

C++-Containerklasse <vector>


beginundendist die wichtigste Iteratorfunktion in vector und wird verwendet, umdie Anfangs- und End-Iteratoren des Containers abzurufen。

beginundendsind Memberfunktionen von Containerklassen:

  • begingibt einen Zeiger auf das erste Element des Containers zurückIterator
  • endgibt eine Position hinter dem letzten Element des Containers zurückIterator(Sentinel-Iterator)

Diese beiden Funktionen sind die Grundlage für die Algorithmen der C++-Standardbibliothek und bereichsbasierte for-Schleifen.

Wortdefinitionen: beginSteht für "begin",endSteht für "end".


Grundlegende Syntax und Parameter

beginundendsind Memberfunktionen von Containerklassen, und ihr Aufruf erfordert keine Argumente.

Syntaxformat

iterator begin();
const_iterator begin() const;

iterator end();
const_iterator end() const;

Parameterbeschreibung

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

Funktionsbeschreibung

  • Rückgabewert:
    • begin()Gibt einen Iterator zurück, der auf das erste Element zeigt.
    • end()Gibt einen Iterator (Sentinel) zurück, der auf die Position nach dem letzten Element zeigt.
  • Wirkung: 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; er kann nicht dereferenziert werden, sondern nur für Vergleiche verwendet werden.

Beispiel

Lassen Sie uns dies anhand einer Reihe von Beispielen gründlich meistern.beginundendVerwendung.

Beispiel 1: Grundlegende Verwendung - Durchlaufen des Containers

Beispiel

#include <iostream>
#include <vector>

int main() {
    std::vector<int> 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 zurück, der auf die Position nach dem letzten Element zeigt.
  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 im Kern im Wesentlichenbeginundend。

Beispiel

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> 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 erfordern Iteratoren, um Bereiche anzugeben.

Beispiel

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> 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 <vector>

int main() {
    std::vector<int> 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: Arithmetische Operationen mit Iteratoren

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

Beispiel

#include <iostream>
#include <vector>

int main() {
    std::vector<int> 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+、-und andere arithmetische Operationen.
  • Sie könnenend() - begin()Berechnen Sie die Größe des Containers.

Beispiel 6: Umwandlung zwischen Iteratoren und Indizes

Iteratoren und Indizes können ineinander umgewandelt werden.

Beispiel

#include <iostream>
#include <vector>

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

    // Index in Iterator umwandeln
    size_t index = 2;
    auto it = numbers.begin() + index;
    std::cout << "Index " << index << " entsprechendes Element: " << *it << std::endl;

    // Iterator in Index umwandeln
    auto iter = numbers.begin() + 3;
    size_t idx = iter - numbers.begin();
    std::cout << "Index, der dem Iterator entspricht: " << idx << std::endl;

    return 0;
}

Erwartete Ausgabe:

索引 2 对应的元素: 30
迭代器对应的索引: 3

Codeanalyse:

  • begin() + indexEinen Index in einen Iterator umwandeln.
  • iter - begin()Einen Iterator in einen Index umwandeln.

Beispiel 7: Iteratoren zum Ändern von Elementen verwenden

Iteratoren geben Referenzen zurück, die zum Ändern von Elementen verwendet werden können.

Beispiel

#include <iostream>
#include <vector>

int main() {
    std::vector<int> 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++-Containerklasse <vector>

Weitere Erweiterungen