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

时间:2009-03-13 21:23:29

标签: 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); 
}

你是怎么做到的?

7 个答案:

答案 0 :(得分:217)

他们不一样,是吗? 一个是副本,另一个是交换。因此函数名称。

我最喜欢的是:

a = b;

ab是向量。

答案 1 :(得分:109)

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

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

  vector<int> new_;
  new_.swap(original); 
}

这样可行,但更简单的方法是

vector<int> new_(original);

答案 2 :(得分:63)

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

std::vector<int> newvector(oldvector);

这比使用std::copy从头到尾遍历整个矢量到std::back_insert到新矢量更简单。

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

答案 3 :(得分:13)

你不应该使用swap来复制向量,它会改变“原始”向量。

将原稿作为参数传递给新的。

答案 4 :(得分:11)

new_vector.assign(old_vector.begin(),old_vector.end()); // Method 1
new_vector = old_vector; // Method 2

答案 5 :(得分:10)

直接回答:

  • 使用=运算符

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

  • 使用构造函数

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

注意:

  • 请勿使用std::vector::swap

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

  • 深或浅的副本?

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

根据维基百科:

  

深度复制,意味着对字段进行解引用:不是对要复制的对象的引用,而是为任何引用的对象创建新的复制对象,并将对这些对象的引用放在B中。

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

参考

The page of std::vector on cplusplus.com

答案 6 :(得分:-11)

如果存在矢量ALREADY并且你想复制,你可以这样做:

newVec.resize(oldVec.size());
memcpy(&newVec.at(0), &oldVec.at(0), oldVec.size());