如何复制到未初始化的矢量?

时间:2017-10-16 00:03:53

标签: c++ stl

我想知道如何将给定矢量中的某些元素复制到另一个元素中。

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 个答案:

答案 0 :(得分:1)

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