从列表<t>转换为向量<t> </t> </t>的一个班轮

时间:2011-03-07 10:48:11

标签: c++ stl

是否存在将list<T>转换为vector<T>的单行内容?

谷歌搜索给了我很多结果,使用手动,冗长的转换,这让我呕吐。我们应该去做一些像列表到矢量转换一样简单的事情吗?

4 个答案:

答案 0 :(得分:104)

您只能使用列表中的所有元素创建一个新向量:

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

其中lstd::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());

但是通过这种方式,每个元素都会被重新构造,因此它可能不是最快的解决方案!