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)) };