std::advance în C++

Iteratori C++98

Mută un iterator cu n poziții înainte (sau înapoi, pentru n negativ), pentru orice tip de container.

Sintaxă
template<class InputIt, class Distance>
void advance(InputIt& it, Distance n);

Ce face std::advance

std::advance(it, n) modifică iteratorul primit: îl mută cu n poziții. Pentru iteratorii cu acces direct (vector, deque, array) face un singur salt, it += n. Pentru liste, seturi și map-uri face ++it de n ori, pentru că acolo nu există salt direct.

Valorile negative sunt permise doar pentru iteratorii bidirecționali (list, set, map, vector), nu pentru std::forward_list. Funcția nu returnează nimic; dacă vrei un iterator nou și să-l păstrezi pe cel vechi, folosește std::next.

Parametri

Parametru Descriere
it Iteratorul care se mută (transmis prin referință).
n Numărul de poziții (negativ = înapoi).

Ce returnează

Nimic (void); iteratorul it este modificat.

Exemple

Exemplul 1: Avans într-o listă și într-un set

#include <iterator>
#include <list>
#include <print>
#include <set>
#include <string>

int main() {
    std::list<std::string> statii{"Gara", "Piața Unirii", "Copou", "Universitate", "Tătărași"};
    auto it = statii.begin();
    std::advance(it, 3);
    std::println("A patra stație: {}", *it);
    std::advance(it, -2);
    std::println("Două înapoi: {}", *it);

    std::set<int> s{10, 20, 30, 40};
    auto si = s.begin();
    std::advance(si, 2);
    std::println("Al treilea element din set: {}", *si);
}

Rezultat

A patra stație: Universitate
Două înapoi: Piața Unirii
Al treilea element din set: 30

Greșeli frecvente

  • Scrii auto it2 = std::advance(it, 2);. Nu compilează: advance returnează void. Folosește std::next(it, 2).
  • Avansezi dincolo de end(). std::advance nu verifică limitele; rezultatul este comportament nedefinit.

Comenzi înrudite

  • 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).
  • std::list: Listă dublu înlănțuită: inserare și ștergere rapidă oriunde, fără invalidarea celorlalte elemente, dar fără acces după poziție.