是否存在将list<T>
转换为vector<T>
的单行内容?
答案 0 :(得分:104)
您只能使用列表中的所有元素创建一个新向量:
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)) };
答案 1 :(得分:15)
接受的答案:
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));
它不是一个单行,但你总是把它包装成一个。
答案 2 :(得分:4)
这个怎么样?
list<T> li;
vector<T> vi;
copy(li.begin(),li.end(),back_inserter(vi));
答案 3 :(得分:0)
尽管此线程已经很旧,但由于“ append()”不再可用,我想向大家展示更新的emplace_back单线:
v.emplace_back(l.begin(), l.end());
但是通过这种方式,每个元素都会被重新构造,因此它可能不是最快的解决方案!