La chiamata a clear()
su un vettore chiamerà i distruttori di tutto ciò che è memorizzato nel vettore, che è un'operazione di tempo lineare. Ma è questo il caso in cui il vettore contiene tipi primitivi come int
o double
?`` std :: vector <primitive> :: clear() `un'operazione a tempo costante?
risposta
Pensate a questo dal POV di come è probabile che sia implementato uno vector
. Quando invochi:
delete [] internalPtr;
Cosa succede?
- Il mucchio deve recuperare un blocco contiguo di spazio
- distruttori devono sparare o ciascun oggetto in internalPtr
Il primo deve ancora accadere per i tipi primitivi, ma distruttori non esistono per loro. Così delete[]
eseguirà interamente basato sulla velocità con cui il cumulo può cancellare un blocco di memoria
Almeno usando il allocatore di default, 'std :: vector' non userà' delete [] internalPtr; '. –
In questo link:
http://www.cplusplus.com/reference/vector/vector/clear/
Dice complessità clear()
è lineare in termini di dimensioni (distruzioni).
Non riesco a trovare nulla nello standard C++ 11 per eseguire il backup. Il link potrebbe essere sbagliato. – juanchopanza
Credo che la risposta dipenda dall'implementazione. Il tempo lineare al massimo è , ma alcune implementazioni potrebbero scegliere di ottimizzarlo.
Per 'Does clearing a vector affect its capacity?', né MSVC né G ++ diminuiscono la capacità dei loro vettori, anche quando viene chiamato .clear
. Osservando le intestazioni G ++, è evidente che .clear
è costante con l'allocatore predefinito, a condizione che gli elementi siano scalari (tipi aritmetici primitivi o puntatori).
Ciò sembra coerente con il fatto che non riesco a trovare nulla su 'vector :: clear()' (o sequenze container 'clear() per quella materia) nello standard. Certo, potrebbe non essere il caso di non cercare correttamente ... – juanchopanza
@juanchopanza: ho cercato nelle specifiche, e sembra davvero che [manchi] (http://stackoverflow.com/questions/14970747/is-the-complexity-of-vectorclear-unspecified). Si noti, tuttavia, che 'cancella (begin(), end())' è specificato per richiedere un tempo pari alla quantità di tempo necessaria per chiamare ogni distruttore. – nneonneo
Beh .. si dice che chiaro() è lineare, ma sappiamo anche che si chiama il distruttore di ogni elemento ...
http://www.cplusplus.com/reference/vector/vector/clear/
Cosa succede se l'ist chiamata distruttore non lineare?
Tuttavia, su primitive il distruttore-chiamata è lineare (o costante, questo non è importante a meno che non sia più che lineare)
quindi sì, su primitive è chiaro() sempre un funzionamento lineare
L'OP chiede in particolare ai primitivi, che hanno distruttori banali. – nneonneo
Dove dice che è lineare? Non riesco a trovarlo da nessuna parte nello standard C++ 11, ma potrei mancare qualcosa. – juanchopanza
@juanchopanza e nneonneo riparati – cIph3r
- 1. vector :: clear() costano così tanto tempo?
- 2. Una chiamata a std :: vector :: clear() imposta std :: vector :: capacity() su zero?
- 3. Vector clear vs. ridimensiona
- 4. vector :: clear in C++
- 5. Come convertire std :: vector <std :: reference_wrapper <T>> a std :: vector <T>
- 6. std :: vector <std::string> crash
- 7. Conversione da std :: string a std :: vector <char>
- 8. Perché <clear></clear> non corrisponde a <clear /> in app.config?
- 9. Posso trasmettere std :: vector <Animal*> a std :: vector <Dog*> senza esaminare ciascun elemento?
- 10. std :: vector <bool> implementazione ottimizzazione
- 11. Passaggio di articoli std :: vector <int> a variadic
- 12. Copia veloce di `std :: vector <std :: uint8_t>`
- 13. Come salvare `std :: vector <uchar>` in `std :: ostream`?
- 14. trova in std :: vector <std::pair>
- 15. Ordinamento di std :: vector <std :: pair <std :: string, bool >> per la stringa?
- 16. Huge std :: vector <std::vector> non rilascia tutta la memoria in caso di distruzione
- 17. nessuna funzione di corrispondenza per la chiamata a std :: vector <std::tuple> push_back
- 18. C'è un modo per convertire std :: vector <const T*> in std :: vector <T*> senza allocazioni aggiuntive?
- 19. I in quale situazione sarà std :: map <A,B> essere più veloce di std :: vector <std :: pair <A,B>> ordinato?
- 20. Convertire uno std :: vector <std :: vector <double>> che rappresenta una matrice 2D per cv :: Mat
- 21. Perché non possiamo dichiarare uno std :: vector <AbstractClass>?
- 22. vector :: clear in libC++ per tipi distruttibili banalmente
- 23. La mia funzione dovrebbe restituire un puntatore a std :: vector o un riferimento a std :: vector?
- 24. emplace_back non funziona con std :: vector <std :: map <int, int>>
- 25. convert <vector><string> TO <vector><int> C++, Win32
- 26. Può std :: vector essere = 'd in un altro std :: vector?
- 27. Errore con `std :: vector <std :: unique_ptr < T >>`
- 28. std :: vector :: assegna equivalente a QVector
- 29. boost :: python: Python lista a std :: vector
- 30. typecasting Eigen :: VectorXd a std :: vector
possibile duplicato di [Qual è la complessità di std :: vector :: clear() quando T è un tipo primitivo?] (http://stackoverflow.com/questions/11235975/what-is-the-complexity-of- stdvectortclear-when-t-is-a-primitive-type) –
nneonneo
possibile duplicato di [std :: vector :: clear, constant time?] (http://stackoverflow.com/questions/14094302/stdvectorintclear-constant-time) –
jogojapan