2017-10-16 15 views
1

我想知道如何去从给定的矢量复制某些元素到另一个。如何复制到未初始化的向量?

std::vector<T> vec2; 
vec2.reserve(N); 
std::copy_if(vec1.begin(), 
      vec1.end(), 
      vec2.begin(), 
      [=](const T& r) { 
      return /*something*/ 
}); 

(此时vec1有一堆的元素了。)

或者我应该使用back_inserter

std::vector<T> vec2; 
vec2.reserve(N); 
std::copy_if(vec1.begin(), 
      vec1.end(), 
      std::back_inserter(vec2), 
      [=](const T& r) { 
      return /*something*/ 
}); 

其中哪些会工作,如果有一个?此外,是否需要保留电话?

+1

您应该使用'back_inserter' –

+0

为什么第一个不能工作? @IgorTandetnik – Dovahkiin

+1

@Dovahkiin它还没有元素,但你要复制的地方。 –

回答

1

第一个解决方案是不正确的,因为reserve不会向您的向量添加元素(它只保留您不能使用的内存)。 copy_if要求输出迭代器是有效的,它指向一个序列的开始,它能够保存所有要复制的元素,而调用reserve后的向量不能保存值,因为它只有原始未初始化的内存所以begin有效地返回一个迭代器到最后。如果以这种方式复制元素,矢量将不会知道这些元素被初始化,这会导致很多问题。
另一方面,第二种解决方案很好。 back_inserter将元素插入向量(这不仅仅是分配内存),以便向量知道发生了什么。请注意,调用reserve不会改变此代码正确性方面的任何内容。我的意思是它可以忽略,代码将工作得很好。但是,如果你知道要插入多少个元素(即使它只是一个近似值),将它留在那里可能是一个好主意。这将减少对性能有利的动态分配数量。