一个从列表<T>转换为vector <T>的Liner

Gra*_*ton 56 c++ stl

是否存在将a转换list<T>vector<T>?的单行程?

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

Bjö*_*lex 106

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

std::vector<T> v{ std::begin(l), std::end(l) };
Run Code Online (Sandbox Code Playgroud)

这里l是一个std::list<T>.这会将列表中的所有元素复制到矢量中.

从C++ 11开始,如果您不再需要原始列表,可以提高效率.您可以将所有元素移动到矢量中,而不是复制:

std::vector<T> v{ std::make_move_iterator(std::begin(l)), 
                  std::make_move_iterator(std::end(l)) };
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是O(N),但效率不高.`std :: vector <T> v; v.reserve(l.size()); v.append(l.begin(),l.end());`更接近于最优.问题是列表迭代器没有有效的`std :: distance`,它是O(N),即使`std :: list :: size`可以是O(1)(并且将在C++ 0x中) ) (19认同)
  • @MSalters:不幸的是,看起来,`vector`没有`append`函数.应该是`v.insert(v.end(),l.begin(),l.end())`. (6认同)
  • 迭代器肯定是一个强大的概念.:) (2认同)

Bar*_*rry 16

接受的回答是:

std::vector<T> v(std::begin(l), std::end(l));
Run Code Online (Sandbox Code Playgroud)

当然是正确的,但它是(颇为遗憾的是)不是最佳鉴于近期在需求的变化即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));
Run Code Online (Sandbox Code Playgroud)

它不是一个衬里,但你总是把它包装成一个.

  • @black这是一个答案,而不是评论.并且没有`vector :: append()`. (3认同)

Him*_*ury 5

这个怎么样?

list<T> li;
vector<T> vi;        
copy(li.begin(),li.end(),back_inserter(vi));
Run Code Online (Sandbox Code Playgroud)

  • @Xeo:不能为_any_迭代器“开始”:尽管它恰好适用于“ vector :: iterator”,但肯定不适用于“ list :: iterator`!”。至少使用`std :: distance`。 (3认同)
  • `copy`不知道预先的元素总数。所以`back_inserter`只会对每个元素`push_back`,导致向量溢出数次。反过来,这将导致重新分配+全部复制元素。(或移动,使用来自C ++ 0x的右值引用) (2认同)