tutorial guia español c++ stl

c++ - guia - Un trazador de líneas para convertir de la lista<T> al vector<T>



tutorial weka en español (3)

¿Hay una sola línea que convierte una list<T> a vector<T> ?

Una búsqueda en Google me devuelve muchos resultados que usan conversión manual y prolongada, lo que me hace vomitar. ¿Deberíamos tomar tantas molestias para hacer algo tan simple como una conversión de lista a vector?


¿Qué tal esto?

list<T> li; vector<T> vi; copy(li.begin(),li.end(),back_inserter(vi));


La respuesta aceptada de:

std::vector<T> v(std::begin(l), std::end(l));

ciertamente es correcto, pero (desafortunadamente) no es óptimo dado el reciente cambio en el requisito de que std::list::size() sea O(1) . Si tiene una implementación conforme de std::list (que, por ejemplo, gcc no tuvo hasta 5+), lo siguiente es bastante más rápido (del orden del 50% una vez que obtengamos 50+ elementos) :

std::vector<T> v; v.reserve(l.size()); std::copy(std::begin(l), std::end(l), std::back_inserter(v));

No es un forro, pero siempre puedes envolverlo en uno.


Solo puedes crear un nuevo vector con todos los elementos de la lista:

std::vector<T> v{ std::begin(l), std::end(l) };

donde l es un std::list<T> . Esto copiará todos los elementos de la lista al vector.

Desde C ++ 11, esto puede hacerse más eficiente si ya no necesita la lista original. En lugar de copiar, puede mover todos los elementos al vector:

std::vector<T> v{ std::make_move_iterator(std::begin(l)), std::make_move_iterator(std::end(l)) };