Ce face std::vector::data
Elementele unui vector stau unul după altul în memorie, ca într-un tablou C. data() dă adresa primului element, așa că poți trimite vectorul funcțiilor care așteaptă un pointer și o lungime (funcții C, biblioteci grafice, std::memcpy, fwrite).
Pointerul rămâne valid doar până la următoarea realocare (de exemplu un push_back care depășește capacitatea). Pentru un vector gol, data() poate fi nullptr, dar nu ai voie să citești prin el oricum.
Ce returnează
Un pointer la primul element; intervalul [data(), data() + size()) este valid.
Exemple
Exemplul 1: Trimiterea vectorului la o funcție în stil C
#include <cstddef>
#include <print>
#include <vector>
// O funcție scrisă în stil C: primește un pointer și numărul de elemente.
double medie(const double* valori, std::size_t n) {
double suma = 0;
for (std::size_t i = 0; i < n; ++i) {
suma += valori[i];
}
return n == 0 ? 0 : suma / static_cast<double>(n);
}
int main() {
std::vector<double> note{9.5, 8.0, 10.0, 7.5};
std::println("Media: {}", medie(note.data(), note.size()));
}
Rezultat
Media: 8.75
Exemplul 2: Copiere rapidă cu std::memcpy
#include <cstring>
#include <print>
#include <vector>
int main() {
std::vector<int> sursa{1, 2, 3, 4};
std::vector<int> copie(sursa.size());
std::memcpy(copie.data(), sursa.data(), sursa.size() * sizeof(int));
std::println("{}", copie);
}
Rezultat
[1, 2, 3, 4]
Greșeli frecvente
- Păstrezi pointerul de la
data()și apoi adaugi elemente. După o realocare, pointerul indică memorie eliberată. - Folosești
data()pestd::vector<bool>. Acest vector special ține biții împachetați și nu are funcțiadata().
Comenzi înrudite
std::vector::operator[]: Accesează elementul de pe o poziție cu v[i], fără verificare a limitelor.std::span: O „fereastră” spre elemente consecutive din memorie (vector, array, tablou C), fără copiere și fără să le dețină.std::vector::reserve: reserve() rezervă memorie pentru n elemente, capacity() spune cât loc este rezervat, iar shrink_to_fit() cere eliberarea locului nefolosit.