我更喜欢两种方式:
void copyVecFast(const vec& original) { vector newVec; newVec.reserve(original.size()); copy(original.begin(),original.end(),back_inserter(newVec)); } void copyVecFast(vec & original) { vector newVec; newVec.swap(original); }
你怎么做呢?
但它们不一样,是吗?一个是副本,另一个是交换.因此功能名称.
我最喜欢的是:
a = b;
哪里a
和b
是向量.
如果通过引用发送参数,则第二个示例不起作用.你的意思是
void copyVecFast(vecoriginal) // no reference { vector new_; new_.swap(original); }
这可行,但更简单的方法
vectornew_(original);
这是制作矢量副本的另一种有效方法,只需使用它的构造函数:
std::vectornewvector(oldvector);
这甚至比使用std::copy
从头到尾将整个矢量传递std::back_insert
到新矢量更简单.
话虽这么说,你的那个.swap()
不是副本,而是交换两个向量.你会修改原件不再包含任何东西了!哪个不是副本.
你不应该使用交换来复制向量,它会改变"原始"向量.
将原始作为参数传递给新的.
使用=
操作员
我们可以使用std::vector::operator=
容器的公共成员函数std::vector
将值从向量分配给另一个.
使用构造函数
此外,构造函数也有意义.具有另一个向量作为参数的构造函数(例如x
)x
以相同的顺序构造具有每个元素的副本的容器.
不使用 std::vector::swap
std::vector::swap
不是将矢量复制到另一个矢量,它实际上是交换两个矢量的元素,正如其名称所暗示的那样.换句话说,要复制的源向量在std::vector::swap
被调用后被修改,这可能不是您所期望的.
深或浅的副本?
如果源向量中的元素是指向其他数据的指针,则有时需要深层复制.
根据维基百科:
深层复制,意味着字段被解除引用:而不是对要复制的对象的引用,为任何引用的对象创建新的复制对象,并在B中放置对这些对象的引用.
实际上,目前在C++中没有内置的方法来进行深层复制.上面提到的所有方法都很浅薄.如果需要深层复制,则可以遍历矢量并手动复制参考.或者,可以考虑使用迭代器进行遍历.关于迭代器的讨论超出了这个问题.
参考页面std::vector
上cplusplus.com
new_vector.assign(old_vector.begin(),old_vector.end()); // Method 1 new_vector = old_vector; // Method 2