2013-02-20 12 views
11

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?

+1

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

+0

possibile duplicato di [std :: vector :: clear, constant time?] (http://stackoverflow.com/questions/14094302/stdvectorintclear-constant-time) – jogojapan

risposta

2

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

+4

Almeno usando il allocatore di default, 'std :: vector' non userà' delete [] internalPtr; '. –

4

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).

+0

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

+0

@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

0

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

+0

L'OP chiede in particolare ai primitivi, che hanno distruttori banali. – nneonneo

+1

Dove dice che è lineare? Non riesco a trovarlo da nessuna parte nello standard C++ 11, ma potrei mancare qualcosa. – juanchopanza

+0

@juanchopanza e nneonneo riparati – cIph3r

Problemi correlati