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).
- 1. C++ 11 std :: vector in concurrent environment
- 2. C++ 11: std :: vector :: shrink_to_fit complex
- 3. C++ 11/C++ 03 e std :: vector filo di sicurezza
- 4. Differenza tra vector :: begin() e std :: begin()
- 5. Value-Initialized Objects in C++ 11 e std :: vector constructor
- 6. C++ 11 std :: array
- 7. Conversione da std :: vector a array
- 8. std :: vector :: assegna equivalente a QVector
- 9. Ereditato da std :: vector
- 10. sizeof() std :: vector (C++)
- 11. C++ in uno std :: vector
- 12. È std :: vector :: data() preservato spostandosi?
- 13. C++ 11 pass vector to constructor
- 14. Copia elementi da std :: vector in std :: stack C++
- 15. Può std :: vector essere = 'd in un altro std :: vector?
- 16. C++ std :: coppia, std :: vector e memcopy
- 17. std :: vector di std :: vettori contiguità
- 18. Esiste un equivalente di std :: vector in PHP in C++?
- 19. C++ std :: vector emplace vs insert
- 20. std :: vector alternativa per C
- 21. Come funziona C++ std :: vector?
- 22. std :: vector <std::string> crash
- 23. Perché la firma std :: vector :: resize è stata modificata in C++ 11?
- 24. Ricerca binaria in std :: vector
- 25. std :: vector or boost :: vector thread safe?
- 26. Cosa succede se uso vector :: begin() invece di std :: back_inserter (vector) per l'output di set_intersection?
- 27. Conversione da std :: string a std :: vector <char>
- 28. std :: vector di riferimenti
- 29. Inizializzazione Eigen :: vector con std :: vector
- 30. Eigen e std :: vector
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