我更喜欢两种方式:
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);
}
你是怎么做到的?
答案 0 :(得分:217)
他们不一样,是吗? 一个是副本,另一个是交换。因此函数名称。
我最喜欢的是:
a = b;
a
和b
是向量。
答案 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 ++中没有内置的方法可以进行深层复制。上面提到的所有方法都很浅薄。如果需要深层复制,则可以遍历矢量并手动复制参考。或者,可以考虑使用迭代器进行遍历。关于迭代器的讨论超出了这个问题。
答案 6 :(得分:-11)
如果存在矢量ALREADY并且你想复制,你可以这样做:
newVec.resize(oldVec.size());
memcpy(&newVec.at(0), &oldVec.at(0), oldVec.size());