2016-05-04 15 views
5

equivale a std::vector::data() in C++ 11? La ragione per cui lo sto chiedendo, prima del C++ 11, ho usato per trattare std :: vector :: begin() come un puntatore ma dopo C++ 11, non lo è, e non posso trasmettere a un puntatore equivalente . Quindi, posso usare data() invece dopo C++ 11?È std :: vector :: begin() da priorC++ 11 equivalente a std :: vector :: data() in C++ 11?

+4

std :: vector :: begin() non è mai stato un puntatore. –

+2

Se si trattasse di 'std :: vector :: begin()' come puntatore, si faceva affidamento su una particolare rappresentazione dell'implementazione di 'std :: vector :: iterator's come puntatori. Non è mai stato garantito che fosse così. – molbdnilo

+0

Stai usando '& (* std :: vector :: begin())' per ottenere un puntatore ai dati vettoriali? – NathanOliver

risposta

8

No, begin restituisce un iteratore, mentre data restituisce un puntatore. Per una determinata implementazione, queste potrebbero essere la stessa cosa, ma non dovresti contare su questo.

+0

In aggiunta a ciò, non era garantito che la memoria di 'std :: vector' fosse contigua prima di C++ 11 - sebbene in pratica un'implementazione che altrimenti sarebbe forse un po 'sciocca. – alcedine

+7

@alcedine In realtà è stato corretto in C++ 03. Era solo C++ 98 e prima non lo garantiva. – NathanOliver

+2

@alcedine, non vero. Era contiguos almeno dal 2003, e ho una forte sensazione che fosse contiguos in 98. – SergeyA

3

Utilizzare l'iteratore come puntatore è completamente sbagliato, poiché è definito dall'implementazione. Se hai ancora bisogno puntatore ai dati al iteratore si consiglia di utilizzare l'indirizzo di iteratore Dereferenced, in questo modo:

std::vector<int> v; v.push_back(42); 
std::vector<int>::iterator it = v.begin(); 
int * p = &*it; 

E, naturalmente, in C++ 11 è possibile utilizzare .data() come puntatore per elementi vettoriali.

2

È std :: vector :: begin() dal precedente C++ 11 equivalente a std :: vector :: data() in C++ 11?

Dipende da cosa intendi per equivalente. Il dereferenziamento produce un riferimento al primo elemento nel vettore, ma non è garantito che l'iteratore restituito da begin() sia convertibile nel tipo di puntatore restituito da data().

Il motivo che sto chiedendo questo, prima di C++ 11, che ho usato per il trattamento di std :: vector :: begin() come un puntatore, ma dopo C++ 11, non è, e non posso cast su un puntatore equivalente.

Il codice ha funzionato con una buona (o cattiva) fortuna, a seconda di come la si guarda.

Quindi, posso usare data() invece dopo C++ 11?

Ci sono due coppie iteratore che stanno a cavallo dei dati del vettore:

begin()-end()

e

data() a data() + size()

è possibile utilizzare in qualsiasi algoritmo standard ed il il risultato sarà lo stesso.

Per motivi di stile, è necessario utilizzare begin() in end() dove è possibile (che sarà quasi sempre).