Ce face std::vector::begin
Un iterator este un „indicator” către un element al containerului. *it citește elementul, ++it trece la următorul. begin() indică primul element, iar end() indică poziția de după ultimul element: este un semn de oprire și nu poate fi citit.
Perechea begin(), end() descrie tot vectorul și este ceea ce primesc algoritmii din <algorithm>: std::sort(v.begin(), v.end()). Bucla for (auto x : v) folosește tot aceste funcții, în spate.
rbegin() și rend() dau iteratori inverși: ++ merge spre începutul vectorului. Variantele cu c (cbegin, cend) dau iteratori prin care nu poți modifica elementele. Iteratorii unui vector sunt invalidați de realocări (push_back, insert, reserve) și de ștergeri.
Ce returnează
Un iterator (sau iterator invers). La un vector gol, begin() == end().
Exemple
Exemplul 1: Parcurgere cu iteratori
#include <print>
#include <vector>
int main() {
std::vector<int> v{3, 1, 4, 1, 5};
for (auto it = v.begin(); it != v.end(); ++it) {
*it *= 10; // modificăm prin iterator
}
std::println("{}", v);
std::println("Al treilea element: {}", *(v.begin() + 2));
std::println("Distanța begin-end: {}", v.end() - v.begin());
}
Rezultat
[30, 10, 40, 10, 50]
Al treilea element: 40
Distanța begin-end: 5
Exemplul 2: Parcurgere de la coadă cu rbegin()
#include <print>
#include <string>
#include <vector>
int main() {
std::vector<std::string> etape{"pregătire", "coacere", "răcire", "servire"};
for (auto it = etape.rbegin(); it != etape.rend(); ++it) {
std::print("{} ", *it);
}
std::println();
}
Rezultat
servire răcire coacere pregătire
Exemplul 3: Iteratori pentru algoritmi
std::sort primește intervalul [begin, end). Cu rbegin/rend, aceeași sortare dă ordinea descrescătoare.
#include <algorithm>
#include <print>
#include <vector>
int main() {
std::vector<int> note{7, 10, 5, 9};
std::sort(note.begin(), note.end());
std::println("Crescător: {}", note);
std::sort(note.rbegin(), note.rend());
std::println("Descrescător: {}", note);
auto it = std::find(note.cbegin(), note.cend(), 9);
std::println("9 este pe poziția {}", it - note.cbegin());
}
Rezultat
Crescător: [5, 7, 9, 10]
Descrescător: [10, 9, 7, 5]
9 este pe poziția 1
Greșeli frecvente
- Citești
*v.end().end()nu indică un element; ultimul element este*(v.end() - 1)sauv.back(). - Folosești un iterator după
push_back,insertsauerase. Operațiile care realocă sau mută elemente îl invalidează; ia un iterator nou după modificare. - Compari iteratori din vectori diferiți (
a.begin() != b.end()). Iteratorii au sens doar în containerul din care provin.
Comenzi înrudite
std::begin: Funcții libere care dau iteratorul de început și de sfârșit pentru orice container, inclusiv pentru tablourile C.std::reverse_iterator: Adaptor care inversează direcția unui iterator: ++ merge spre începutul containerului. Este tipul returnat de rbegin().std::vector::erase: Șterge un element sau un interval de elemente din vector și returnează iteratorul elementului de după.std::next: std::next returnează un iterator mutat cu n poziții înainte, std::prev unul mutat înapoi; originalul rămâne neschimbat.std::distance: Numără câte poziții sunt între doi iteratori, adică câte elemente are intervalul [prim, ultim).