Während wir den Vektor verwenden, verwenden wir manchmal den Operator [] wie Hausaufgaben [Mitte], aber verwenden Sie auch mal homework.begin(). Auch, homework.end() nicht Hausaufgaben [Ende], aber das ist wie beginnen. Geht es nur darum, auf die Elemente anders zuzugreifen? Es ist auf diese Weise verwirrender, stimmst du nicht zu?vector -> Verwendung der Elementfunktionen begin() und end() vs. the operator []
Antwort
vector :: operator [] ruft das N-te Element des Vektors ab. Ein solcher Operator ist nur für ausgewählte STL-Containerklassen definiert.
vector.end() ist eine Methode, die einen Iterator zurückgibt. Iteratoren sind spezielle Einheiten zum Arbeiten mit STL-Containern, inklusive Vektor. vector :: end() zeigt auf das Element, das unmittelbar auf das letzte Element des Vektors folgt - es wird oft als Wert behandelt, um den Iterator gegenzuhalten, um zu bestimmen, ob der gesamte Container durchlaufen wurde.
begin() und end() sind Elementfunktionen des Vektors, die einen Iterator zurückgeben. Dieser Iterator kann dereferenziert werden, um den Wert zu erhalten. Ähnlich haben Sie den Operator [], der einen Index übernimmt und den an dieser Position gespeicherten Wert direkt zurückgibt.
Es ist die gleiche Analogie wie bei C-Arrays ...
int a [length_a]
"Beginn/Ende" Version:
int* begin = a;
int* end = a+length_a;
while (p<e) {
printf("%d", *p);
++p;
}
Hinweis wie "Ende" ein Element verweist jenseits des Arrays! Es ist genau dasselbe wie vector :: end (denke darüber nach wie eine Stoppbedingung).
"[]" Version:
for (int i=0; i<length_a; ++i) {
printf("%d", a[i]);
}
'[]' Zusammenfassung:
+ kompatibel mit C-Arrays, effiziente Syntax
-nicht für nicht-zufällige Zugriff auf Container (zum Beispiel: Wechsel zu "Liste" wird schwierig sein)
mein POV Rat:
Verwendung [] für den Direktzugriff oder als 'leicht' Array c Upgrade
Verwendung Beginn/Ende, wenn ganze Inhalt sequentiell durchqueren
+1, ist die Anologie hilfreich. Vielleicht möchten Sie "Es ist genau das gleiche wie vector :: end" umschreiben, da es leicht ist, einen Iterator mit einem Zeiger zu verwechseln. Es ist genauer zu sagen "Es ist genau analog zu vector :: end". –
Sie machen verschiedene Dinge. operator[n]
liefert eine Referenz eine Referenz auf das n
te Element. begin() und end() gibt Iteratoren zurück, die auf den Anfang und das Ende des Containers zeigen. Wenn Sie über den Container iterieren müssen, ist die Verwendung von Iteratoren kaum "verwirrender". Es ist viel einfacher.
Angenommen, Sie haben einen Vektor v haben:
std::vector<int> v;
v.push_back(1);
v.push_back(7);
v.push_back(42);
v.push_back(3);
, wenn Sie wollen einfach nur ein Element verweisen, haben Sie folgende Optionen:
v[2];
*v.begin()+2;
Also hier, operator[]
ist einfacher. Aber wenn man über den Behälter zu durchlaufen wollen, vielleicht um den Inhalt zu drucken, haben Sie diese Optionen:
for (int i = 0; i < v.size(); ++i){
std::cout << v[i];
}
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout));
Plötzlich rettete die Iteratoren uns eine Menge Arbeit. Wir müssen keine Schleife mehr machen.
Oder lassen Sie uns sagen Sie das größte Element finden wollte:
int max = 0;
for (int i = 0; i < v.size(); ++i){
if (v[i] > max) { max = v[i]; }
}
std::max_element(v.begin(), v.end());
oder vielleicht wollen Sie den Vektor sortieren. Ich werde nicht einmal die Mühe, meine eigenen Sortieralgorithmus auszuschreiben mit operator[]
, aber hier ist der Iterator Version:
std::sort(v.begin(), v.end());
Aus diesem Grund beginnen(), Ende() sind nützlich.
- 1. wxPython - Begin und End BusyCursor
- 2. SQL Server BEGIN/END vs BEGIN TRANS/COMMIT/ROLLBACK
- 3. Get Array von. Begin() und. End() Iteratoren
- 4. SQL "IF", "BEGIN", "END", "END IF"?
- 5. Unterschied zwischen Vektor :: begin() und std :: begin()
- 6. Naming: BEGIN ~ END vs Live ~ EVIL Block strukturierte Sprachen
- 7. Mitglied Funktion .begin() und std :: begin()
- 8. Merge vector und initializer_list bei der Initialisierung des Vektors <vector<T>>?
- 9. ist begin..end in OCaml syntaktischer Zucker?
- 10. Binäre Suche mit Iteratoren, warum verwenden wir "(end - begin)/2"?
- 11. Was sagt der C++ Standard über std :: vector <int> v1, v2; std :: Abstand (v1.begin(), v2.begin())?
- 12. Benutzerdefinierte Befehl für ‚\ {Umgebung} begin ... \ end {Umgebung}‘
- 13. Sparse Vector vs Dense Vector
- 14. "BEGIN" und "END PGP MESSAGE" Strings macht Entschlüsselung Pause
- 15. Strange Fehler beim Verwenden der Vorlage <Klasse InputIterator> Zeichenfolge (InputIterator begin, InputIterator end);
- 16. Vector vs SynchronizedList Performance
- 17. std :: array operator [] vs get <>
- 18. Std :: Vector <Dekltyp (Iter)> - gültige Verwendung von Dekltyp?
- 19. Iterator-Invalidierung durch `std :: string :: begin()`/`std :: string :: end()`?
- 20. Was zwischen tun Vektor <vector<T...> der Unterschied> und Vektor <vector<T> ...>
- 21. ZWISCHEN Operator vs.> = UND <=: Gibt es einen Leistungsunterschied?
- 22. "CREATE PROCEDURE SPNAME AS" vs. "CREATE PROCEDURE SPNAME als BEGIN/END"
- 23. Performance Operator vs Funktionsaufruf Überlastung
- 24. Vector Iterator: keine Übereinstimmung für 'operator ='
- 25. Vektorinitialisierung mit Std :: Begin und Std :: Ende
- 26. Vector Drawable VS PNG
- 27. std :: vector :: erase vs "swap und Pop"
- 28. BEGIN - END Block atomare Transaktionen in PL/SQL
- 29. Mit <vector> mit cin und für() Schleife C++
- 30. Vector von std :: function <>
"Es ist auf diese Weise verwirrender, nicht einverstanden?" Ja, du hast es so verwirrend wie möglich gemacht. Außer vielleicht einen Template Compile Fehler hinzuzufügen? –
Was war die Frage noch einmal? – soulmerge
Völlig inkohärent. Bitte bearbeiten Sie Ihre Frage, damit wir einen Hinweis bekommen, wonach Sie fragen. –