Ce face std::vector::at
v.at(i) face același lucru ca v[i] (returnează o referință la elementul de pe poziția i), dar verifică întâi dacă i < v.size(). Dacă poziția nu există, aruncă excepția std::out_of_range, pe care o poți prinde cu try/catch.
operator[] nu verifică nimic: o poziție greșită înseamnă comportament nedefinit. Folosește at() când poziția vine din afara programului (de la utilizator, dintr-un fișier) sau când vrei o eroare clară în loc de un rezultat aleatoriu. Verificarea costă foarte puțin.
Parametri
| Parametru | Descriere |
|---|---|
pozitie |
Indicele elementului, de la 0 la size() - 1. |
Ce returnează
O referință la element: o poți citi sau modifica (v.at(0) = 5;).
Exemple
Exemplul 1: Citire și modificare
#include <print>
#include <vector>
int main() {
std::vector<int> note{7, 9, 6};
std::println("A doua notă: {}", note.at(1));
note.at(2) = 10; // modificăm prin referința returnată
std::println("Notele: {}", note);
}
Rezultat
A doua notă: 9
Notele: [7, 9, 10]
Exemplul 2: Poziție inexistentă: std::out_of_range
Vectorul are 3 elemente (pozițiile 0, 1, 2). Poziția 5 aruncă o excepție, pe care o prindem. Textul din what() depinde de bibliotecă.
#include <print>
#include <stdexcept>
#include <vector>
int main() {
std::vector<int> note{7, 9, 6};
try {
std::println("Nota 5: {}", note.at(5));
} catch (const std::out_of_range& e) {
std::println("Eroare prinsă: out_of_range ({})", e.what());
}
std::println("Programul continuă normal.");
}
Rezultat
Eroare prinsă: out_of_range (vector)
Programul continuă normal.
Exemplul 3: Poziție aleasă de utilizator
Indicele vine de la tastatură, deci nu avem încredere în el.
#include <iostream>
#include <print>
#include <stdexcept>
#include <string>
#include <vector>
int main() {
std::vector<std::string> zile{"luni", "marți", "miercuri", "joi", "vineri"};
std::size_t nr = 0;
std::cin >> nr;
try {
std::println("Ziua {} este {}", nr, zile.at(nr - 1));
} catch (const std::out_of_range&) {
std::println("Nu există ziua {}. Alege între 1 și {}.", nr, zile.size());
}
}
Ce scrie utilizatorul (intrare)
7
Rezultat
Nu există ziua 7. Alege între 1 și 5.
Greșeli frecvente
- Crezi că
v[i]verifică poziția la fel caat(). Nu verifică.v[10]pe un vector cu 3 elemente nu aruncă nimic; citește memorie străină (comportament nedefinit). - Prinzi excepția cu
catch (std::out_of_range e)(prin valoare). Merge, dar copiază obiectul; scriecatch (const std::out_of_range& e).
Comenzi înrudite
std::vector::operator[]: Accesează elementul de pe o poziție cu v[i], fără verificare a limitelor.std::vector::front: front() returnează primul element al vectorului, iar back() ultimul.std::map::at: Returnează valoarea unei chei existente; aruncă std::out_of_range dacă cheia nu există, fără să o adauge.std::vector::size: size() spune câte elemente are vectorul; empty() spune dacă nu are niciunul.std::out_of_range: Excepție aruncată când un index sau o cheie este în afara limitelor (vector::at, string::substr, map::at).