2009-09-23 3 views
5

È possibile trasferire la proprietà di un contenuto vettoriale da un vettore a un altro?Trasferisci la proprietà all'interno dei contenitori STL?

vector<T> v1; 
// fill v1 
vector<T> v2 = OvertakeContents(v1); 
// now v1 would be empty and v2 would have all the contents of v1 

È possibile per gli elenchi con la funzione di giunzione. Questo dovrebbe essere possibile anche in tempo costante per l'intero vettore.

Se non lo è, perché no?

+2

nota a margine: "swap" è stato menzionato già. Ma vorrei aggiungere che in C++ 0x puoi semplicemente sostituire "OvertakeContents" con "std :: move" e farà ciò che vuoi. – sellibitze

risposta

10

Partenza std :: scambio

vector<T> v1; 
// fill v1 

vector<T> v2; 

swap(v1, v2); 
OR 
v2.swap(v1); 

Swap Reference

+1

la nota è completamente falsa: tutti i contenitori STL forniscono un sovraccarico equivalente di std :: swap (a, b) con la stessa semantica di a.swap (b) –

+0

@Greg. Grazie per aver segnalato l'errore nella mia nota. Osservando il riferimento per Vector.swap, hanno effettivamente la stessa semantica. –

10

std :: vector ha una funzione swap() che funziona più o meno come questo.

vector<T> v2; 
v2.swap(v1); 
+0

L'ho quasi revocata, tuttavia, il tuo codice è sintatticamente sbagliato. – avakar

+0

@avakar: hai ragione. Corretto. –

0

Qui ci sono due punti:

1) Per qualsiasi tipo assegnabili, swap può essere definita in termini di assegnazione. Ciò richiede tre assegnazioni, ognuna delle quali, per un tipo di contenitore, è lineare nella dimensione del contenitore. In un certo senso, quindi, a.swap (b) è ridondante. Esiste solo per ragioni di efficienza: per molti contenitori, come il vettore e la lista, è possibile implementare lo swap in modo tale che la sua complessità di runtime sia costante anziché lineare. Se ciò è possibile per alcuni tipi di contenitore X, lo scambio di specializzazione del modello (X &) può essere semplicemente scritto in termini di X: swap (X &). L'implicazione di ciò è che X: swap (X &) deve essere definito solo se esiste un'implementazione a tempo costante. Non tutte le classi contenitore X hanno bisogno di una funzione membro di questo tipo, ma se la funzione membro esiste, allora è garantito che il tempo sia ammortizzato.

2) Se avete bisogno di un altro contenitore che ha stessi elementi di cui si voleva trasferire la proprietà Si prega di creare un semplice copia per una migliore efficienza