2010-08-31 8 views
8

Tengo dos clases A y B, y existe un operador de conversión implícita para pasar de una a la otra, de modo que:¿Hay una forma estándar de convertir desde el contenedor <Type1> al contenedor <Type2>?

A a; 
B b; 
b = a; // Works 

¿Hay una manera estándar para convertir un std::list<A> a un std::list<B>? (O incluso de std::vector<A> a std::list<B>).

Sé que puedo iterar a través de la lista y construir el segundo elemento de la lista por el artículo, pero me pregunto si hay una solución más elegante.

Desafortunadamente No puedo usar boost pero por curiosidad como una pregunta extra, si boost puede manejar esto, me gustaría saber cómo hacerlo.

+0

Supongo que se debe haber preguntado antes, pero no pude encontrarlo. – ereOn

Respuesta

15

Bueno, sí. Cada tipo de contenedor de secuencia tiene un constructor de plantilla que toma un par de iteradores (un rango de iterador) como entrada. Se puede usar para construir una secuencia a partir de otra, independientemente de los tipos de secuencia, siempre que los tipos de elemento de secuencia sean convertibles entre sí. Como por ejemplo

std::vector<A> v; 
... 
std::list<B> l(v.begin(), v.end()); 

también contenedores de secuencias tienen assign función miembro que hace lo mismo con la semántica de asignación (en contraposición a la inicialización semántica).

std::vector<A> v; 
std::list<B> l; 
... 
l.assign(v.begin(), v.end()); // replaces the contents of `l` 
+0

No puedo creer que fuera tan simple. Y no puedo creer que no haya pensado en eso. Muchas gracias;) – ereOn

+0

si un tipo no es convertible a tipo B, ¿cuál debería ser el comportamiento? – bjskishore123

+0

dependiendo de eaxtly lo que está haciendo, y que es propietaria de la lista, std :: copia puede ser digno de una mirada así, posiblemente con un iterador de inserción –

Cuestiones relacionadas