std::vector::begin în C++

std::vector C++98

begin() dă un iterator la primul element, end() unul după ultimul, iar rbegin() pornește parcurgerea de la coadă.

Sintaxă
iterator begin() noexcept;
iterator end() noexcept;
reverse_iterator rbegin() noexcept;
reverse_iterator rend() noexcept;
// plus cbegin(), cend(), crbegin(), crend() pentru acces doar la citire

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) sau v.back().
  • Folosești un iterator după push_back, insert sau erase. 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).