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?
risposta
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.
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
@alcedine In realtà è stato corretto in C++ 03. Era solo C++ 98 e prima non lo garantiva. – NathanOliver
@alcedine, non vero. Era contiguos almeno dal 2003, e ho una forte sensazione che fosse contiguos in 98. – SergeyA
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.
È 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).
std :: vector :: begin() non è mai stato un puntatore. –
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
Stai usando '& (* std :: vector :: begin())' per ottenere un puntatore ai dati vettoriali? – NathanOliver