我更喜欢两种方式:
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)
哪里a和b是向量.
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)
X-I*_*nce 69
这是制作矢量副本的另一种有效方法,只需使用它的构造函数:
std::vector<int> newvector(oldvector);
Run Code Online (Sandbox Code Playgroud)
这甚至比使用std::copy从头到尾将整个矢量传递std::back_insert到新矢量更简单.
话虽这么说,你的那个.swap()不是副本,而是交换两个向量.你会修改原件不再包含任何东西了!哪个不是副本.
Jer*_*ang 14
=操作员我们可以使用std::vector::operator=容器的公共成员函数std::vector将值从向量分配给另一个.
此外,构造函数也有意义.具有另一个向量作为参数的构造函数(例如x)x以相同的顺序构造具有每个元素的副本的容器.
std::vector::swap std::vector::swap不是将矢量复制到另一个矢量,它实际上是交换两个矢量的元素,正如其名称所暗示的那样.换句话说,要复制的源向量在std::vector::swap被调用后被修改,这可能不是您所期望的.
如果源向量中的元素是指向其他数据的指针,则有时需要深层复制.
根据维基百科:
深层复制,意味着字段被解除引用:而不是对要复制的对象的引用,为任何引用的对象创建新的复制对象,并在B中放置对这些对象的引用.
实际上,目前在C++中没有内置的方法来进行深层复制.上面提到的所有方法都很浅薄.如果需要深层复制,则可以遍历矢量并手动复制参考.或者,可以考虑使用迭代器进行遍历.关于迭代器的讨论超出了这个问题.
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)
| 归档时间: |
|
| 查看次数: |
322162 次 |
| 最近记录: |