std::vector::at în C++

std::vector C++98

Returnează elementul de la o poziție, cu verificare: aruncă std::out_of_range dacă poziția nu există.

Sintaxă
reference at(size_type pozitie);
const_reference at(size_type pozitie) const;

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 ca at(). 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; scrie catch (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).