class Example
{
public: int i;
Example(const Example &e)
{
i = e.i;
}
Example(int i)
{
this->i = i;
}
};
int main()
{
std::vector<Example*> vec;
std::vector<Example*> newVec;
Example* ex1 = new Example(1);
Example* ex2 = new Example(2);
vec.push_back(ex1);
vec.push_back(ex2);
//newVec = vec; --> This does shallow copy
for(int i=0; i<vec.size(); ++i) // --> Deep copy
{
Example newE(*(vec[i]));
newVec.push_back(&newE);
}
for(int i=0; i<newVec.size(); ++i)
{
std::cout << "\nfoobar" << newVec[i]->i << "\n";
}
}
上面的代码打印了两次 foobar2。它不应该打印 foobar1 和 foobar2 吗?另外,这是复制包含对象的 vector 的最佳方法吗?我想要深度复制。
最佳答案
for(int i=0; i<vec.size(); ++i) // --> Deep copy { Example newE(*(vec[i])); newVec.push_back(&newE); }
在此代码中,您复制了 vec[i]
至 Example newE
.那你push_back
newE
的地址到 newVec
vector 。然后 newE
对象超出范围并被销毁,所以你最终有一个指向内部垃圾的指针 newVec
.
如果您想要 vector 内容的深层拷贝,并且您想要存储指向对象的拥有指针,请考虑使用智能指针 vector ,例如vector<shared_ptr<Example>>
.
在这种情况下,您可以简单地使用 operator=
复制 vector ,以及 shared_ptr
的引用计数s 将自动更新。
Yoy 可能还想考虑更简单的设计,即 vector<Example>
(没有指针间接)。
关于c++ - vector 中的 push_back 是否在同一位置插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45752671/