当前位置:  开发笔记 > 编程语言 > 正文

快速将一个矢量复制到另一个矢量

如何解决《快速将一个矢量复制到另一个矢量》经验,为你挑选了6个好方法。

我更喜欢两种方式:

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); 
}

你怎么做呢?



1> Daniel Earwi..:

但它们不一样,是吗?一个是副本,另一个是交换.因此功能名称.

我最喜欢的是:

a = b;

哪里ab是向量.


实际上,该方法是通过值传递,编译器调用复制构造函数,然后交换新创建的元素.这就是为什么rlbond建议直接调用复制构造函数来实现相同的效果.

2> rlbond..:

如果通过引用发送参数,则第二个示例不起作用.你的意思是

void copyVecFast(vec original) // no reference
{

  vector new_;
  new_.swap(original); 
}

这可行,但更简单的方法

vector new_(original);


那是交换,而不是复制.

3> X-Istence..:

这是制作矢量副本的另一种有效方法,只需使用它的构造函数:

std::vector newvector(oldvector);

这甚至比使用std::copy从头到尾将整个矢量传递std::back_insert到新矢量更简单.

话虽这么说,你的那个.swap()不是副本,而是交换两个向量.你会修改原件不再包含任何东西了!哪个不是副本.



4> Raz..:

你不应该使用交换来复制向量,它会改变"原始"向量.

将原始作为参数传递给新的.



5> Jerry Yang..:
直接回答:

使用=操作员

我们可以使用std::vector::operator=容器的公共成员函数std::vector将值从向量分配给另一个.

使用构造函数

此外,构造函数也有意义.具有另一个向量作为参数的构造函数(例如x)x以相同的顺序构造具有每个元素的副本的容器.

警告:

不使用 std::vector::swap

std::vector::swap不是矢量复制到另一个矢量,它实际上是交换两个矢量的元素,正如其名称所暗示的那样.换句话说,要复制的源向量在std::vector::swap被调用后被修改,这可能不是您所期望的.

深或浅的副本?

如果源向量中的元素是指向其他数据的指针,则有时需要深层复制.

根据维基百科:

深层复制,意味着字段被解除引用:而不是对要复制的对象的引用,为任何引用的对象创建新的复制对象,并在B中放置对这些对象的引用.

实际上,目前在C++中没有内置的方法来进行深层复制.上面提到的所有方法都很浅薄.如果需要深层复制,则可以遍历矢量并手动复制参考.或者,可以考虑使用迭代器进行遍历.关于迭代器的讨论超出了这个问题.

参考

页面std::vector上cplusplus.com



6> FaridLU..:
new_vector.assign(old_vector.begin(),old_vector.end()); // Method 1
new_vector = old_vector; // Method 2

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有