std::vector::data în C++

std::vector C++11

Returnează un pointer la primul element al vectorului, pentru funcții care lucrează cu tablouri C.

Sintaxă
T* data() noexcept;
const T* data() const noexcept;

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() pe std::vector<bool>. Acest vector special ține biții împachetați și nu are funcția data().

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.