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

142 c++ algorithm stl

我更喜欢两种方式:

void copyVecFast(const vec<int>& original)
{
  vector<int> newVec;
  newVec.reserve(original.size());
  copy(original.begin(),original.end(),back_inserter(newVec));
}

void copyVecFast(vec<int>& original)
{

  vector<int> newVec;
  newVec.swap(original); 
}
Run Code Online (Sandbox Code Playgroud)

你怎么做呢?

Dan*_*ker 232

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

我最喜欢的是:

a = b;
Run Code Online (Sandbox Code Playgroud)

哪里ab是向量.

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

rlb*_*ond 112

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

void copyVecFast(vec<int> original) // no reference
{

  vector<int> new_;
  new_.swap(original); 
}
Run Code Online (Sandbox Code Playgroud)

这可行,但更简单的方法

vector<int> new_(original);
Run Code Online (Sandbox Code Playgroud)

  • 那是交换,而不是复制. (6认同)
  • @sdd - 不,不是。检查参数列表。`original` 是函数参数的副本。 (2认同)

X-I*_*nce 69

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

std::vector<int> newvector(oldvector);
Run Code Online (Sandbox Code Playgroud)

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

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


Raz*_*Raz 14

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

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


Jer*_*ang 14

直接回答:

  • 使用=操作员

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

  • 使用构造函数

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

警告:

  • 不使用 std::vector::swap

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

  • 深或浅的副本?

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

根据维基百科:

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

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

参考

页面std::vector上cplusplus.com


Far*_*dLU 12

new_vector.assign(old_vector.begin(),old_vector.end()); // Method 1
new_vector = old_vector; // Method 2
Run Code Online (Sandbox Code Playgroud)