Один лайнер для преобразования из списка <T>в вектор <T> - PullRequest
55 голосов
/ 07 марта 2011

Есть ли одна строка, которая преобразует list<T> в vector<T>?

Поиск в Google возвращает мне много результатов, которые используют длительное ручное преобразование, которое вызывает у меня рвоту.Должны ли мы пойти на такие неприятности, чтобы сделать что-то столь же простое, как преобразование списка в вектор?

Ответы [ 4 ]

104 голосов
/ 07 марта 2011

Вы можете создать новый вектор только со всеми элементами из списка:

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

, где l - это std::list<T>. Это скопирует все элементы из списка в вектор.

Начиная с C ++ 11 это можно сделать более эффективным, если вам больше не нужен оригинальный список. Вместо копирования вы можете переместить все элементы в вектор:

std::vector<T> v{ std::make_move_iterator(std::begin(l)), 
                  std::make_move_iterator(std::end(l)) };
15 голосов
/ 17 ноября 2015

Принятый ответ:

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

, безусловно, правильно, но (к сожалению) не оптимально, учитывая недавнее изменение в требовании, чтобы std::list::size() было O(1). Если у вас есть соответствующая реализация std::list (которой, например, gcc не было до 5+), то следующее будет немного быстрее (порядка 50%, как только мы получим до 50+ элементов):

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

Это не один вкладыш, но вы всегда можете обернуть его в один.

4 голосов
/ 07 марта 2011

Как насчет этого?

list<T> li;
vector<T> vi;        
copy(li.begin(),li.end(),back_inserter(vi));
0 голосов
/ 09 июля 2019

Хотя этот поток уже старый, так как "append ()" больше не доступен, я хотел показать более новую однострочную emplace_back:

v.emplace_back(l.begin(), l.end());

Но так каждый элемент будетпостроено, так что это может быть не самое быстрое решение!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...