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ă:advancereturneazăvoid. Foloseștestd::next(it, 2). - Avansezi dincolo de
end().std::advancenu 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.