Подтвердить что ты не робот

Один лайнер для преобразования из списка <T> в вектор <T>

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

Хотя этот поток уже старый, я хотел показать более новую строку emplace_back:

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