std::begin în C++

Iteratori C++11

Funcții libere care dau iteratorul de început și de sfârșit pentru orice container, inclusiv pentru tablourile C.

Sintaxă
#include <iterator>

auto begin(C& container) -> decltype(container.begin());
T* begin(T (&tablou)[N]);
// la fel std::end, plus std::cbegin, std::cend, std::rbegin, std::rend

Ce face std::begin

std::begin(x) și std::end(x) fac același lucru ca x.begin() și x.end(), dar merg și pe tablourile C (int t[5]), care nu au funcții membre. Pentru un tablou C returnează pointeri la primul element și la poziția de după ultimul.

Sunt utile în codul generic (șabloane), care trebuie să funcționeze cu orice fel de colecție. Bucla for (auto x : colectie) folosește, în spate, exact această regulă. În C++20 există și variantele din std::ranges (std::ranges::begin), cu verificări suplimentare.

Parametri

Parametru Descriere
container / tablou Un container standard, un tablou C sau orice tip cu funcții membre begin()/end().

Ce returnează

Un iterator (sau pointer) la primul element, respectiv la poziția de după ultimul.

Exemple

Exemplul 1: Același cod pentru tablou C și vector

#include <algorithm>
#include <iterator>
#include <print>
#include <vector>

template <class Colectie>
int maxim(const Colectie& c) {
    return *std::max_element(std::begin(c), std::end(c));
}

int main() {
    int tablou[] = {4, 17, 9, 2};
    std::vector<int> v{8, 3, 21};

    std::sort(std::begin(tablou), std::end(tablou));
    std::println("Tablou sortat: {}", tablou);
    std::println("Maxim tablou: {}, maxim vector: {}", maxim(tablou), maxim(v));
    std::println("Elemente în tablou: {}", std::end(tablou) - std::begin(tablou));
}

Rezultat

Tablou sortat: [2, 4, 9, 17]
Maxim tablou: 17, maxim vector: 21
Elemente în tablou: 4

Greșeli frecvente

  • Folosești std::begin pe un tablou primit ca parametru int t[]. În funcție, t este de fapt un pointer și nu își mai cunoaște lungimea, așa că nu compilează. Folosește std::span sau std::array.

Comenzi înrudite

  • std::vector::begin: begin() dă un iterator la primul element, end() unul după ultimul, iar rbegin() pornește parcurgerea de la coadă.
  • std::size: std::size dă numărul de elemente al unui container sau tablou C; std::empty spune dacă nu are elemente.
  • std::next: std::next returnează un iterator mutat cu n poziții înainte, std::prev unul mutat înapoi; originalul rămâne neschimbat.
  • std::reverse_iterator: Adaptor care inversează direcția unui iterator: ++ merge spre începutul containerului. Este tipul returnat de rbegin().