2009-09-23 11 views
5

¿Es posible transferir la propiedad de un vector de contenido de un vector a otro?¿Transferir la propiedad dentro de contenedores 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 

Es posible para las listas con función de empalme. Esto debería ser posible en tiempo constante para todo el vector también.

Si no es así, ¿por qué no?

+2

nota al margen: "intercambio" ha sido ya mencionado. Pero me gustaría añadir que en C++ 0x simplemente puede reemplazar "OvertakeContents" por "std :: move" y hará lo que quiera. – sellibitze

Respuesta

10

Salida std :: swap de

vector<T> v1; 
// fill v1 

vector<T> v2; 

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

Swap Reference

+1

su nota es completamente falsa: todos los contenedores STL proporcionan una sobrecarga equivalente de std :: swap (a, b) con la misma semántica que a.swap (b) –

+0

@Greg. Gracias por señalar el error en mi nota. Al ver la referencia para Vector.swap, sí tienen la misma semántica. –

10

std :: vector tiene una función de intercambio() que funciona muy parecido a esto.

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

Casi le doy la vuelta, sin embargo, su código es sintácticamente incorrecto. – avakar

+0

@avakar: Tienes razón. Corregido –

0

Aquí hay dos puntos:

1) para cualquier tipo asignable, de intercambio se puede definir en términos de asignación. Esto requiere tres asignaciones, cada una de las cuales, para un tipo de contenedor, es lineal en el tamaño del contenedor. En cierto sentido, entonces, a.swap (b) es redundante. Existe únicamente por el bien de la eficiencia: para muchos contenedores, como el vector y la lista, es posible implementar el intercambio de manera que su complejidad en tiempo de ejecución sea constante en lugar de lineal. Si esto es posible para algún tipo de contenedor X, entonces el intercambio de especialización de plantilla (X &, X &) simplemente se puede escribir en términos de X :: swap (X &). La implicación de esto es que X :: swap (X &) solo se debe definir si existe una implementación de tiempo constante. No todos los contenedores clase X necesitan tener dicha función miembro, pero si la función miembro existe, entonces se garantiza que se amortizará a tiempo constante.

2) Si necesita otro contenedor que tiene los mismos elementos para los cuales se quiso trasladar la propiedad Por favor, cree una copia simple para una mejor eficiencia

Cuestiones relacionadas