C++ <vector> begin / end-Funktion
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ückIteratorendgibt 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 <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:
numbers.begin()Gibt einen Iterator zurück, der auf das erste Element (10) zeigt.numbers.end()Gibt einen Iterator zurück, der auf die Position nach dem letzten Element zeigt.- Schleifenbedingung
it != 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 <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 auf
begin()undend()。
Beispiel 3: Verwendung von STL-Algorithmen
Algorithmen der Standardbibliothek erfordern Iteratoren, um Bereiche anzugeben.
Beispiel
#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 <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 <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önnen
end() - 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 <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 <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.
Weitere Erweiterungen