C++ Usando std :: vector come array C


Esempio

Esistono diversi modi per utilizzare un std::vector come un array C (ad esempio, per la compatibilità con le librerie C). Questo è possibile perché gli elementi in un vettore sono memorizzati in modo contiguo.

C ++ 11
std::vector<int> v{ 1, 2, 3 };
int* p = v.data();

A differenza delle soluzioni basate su precedenti standard C ++ (vedi sotto), la funzione membro .data() può anche essere applicata ai vettori vuoti, perché in questo caso non causa un comportamento indefinito.

Prima di C ++ 11, dovresti prendere l'indirizzo del primo elemento del vettore per ottenere un puntatore equivalente, se il vettore non è vuoto, questi due metodi sono intercambiabili:

int* p = &v[0];      // combine subscript operator and 0 literal

int* p = &v.front(); // explicitly reference the first element

Nota: se il vettore è vuoto, v[0] e v.front() non sono definiti e non possono essere utilizzati.

Quando si memorizza l'indirizzo di base dei dati del vettore, si noti che molte operazioni (come push_back , resize , ecc.) Possono modificare la posizione della memoria di dati del vettore, invalidando così i puntatori di dati precedenti . Per esempio:

std::vector<int> v;
int* p = v.data();
v.resize(42);      // internal memory location changed; value of p is now invalid