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