One liner to convert from list<T> to vector<T>

You can only create a new vector with all the elements from the list:

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

where l is a std::list<T>. This will copy all elements from the list to the vector.

Since C++11 this can be made more efficient if you don't need the original list anymore. Instead of copying, you can move all elements into the vector:

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

The accepted answer of:

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

is certainly correct, but it's (quite unfortunately) not optimal given the recent change in requirement that std::list::size() be O(1). If you have a conforming implementation of std::list (which, for instance, gcc didn't have until 5+), then the following is quite a bit faster (on the order of 50% once we get to 50+ elements):

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

It's not a one liner, but you could always wrap it in one.


How about this?

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

Tags:

C++

Stl