c++ - vector 中的 push_back 是否在同一位置插入?

标签 c++ pointers vector

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/

相关文章:

c - 功能参数差异 : double pointer VS 2D array

c++ - 当我将它添加到指针时,我可以安全地忽略溢出检查的最小偏移量是多少?

c++ - 迁移 C-->C++ 指向函数的指针会引发编译器错误

c# - 两个向量 2D 之间的角度

c++ - VS2010 无法链接它应该构建的库

c++ - 带参数调用类构造函数 - 'x' 中非类类型成员的请求

c++ - 何时以及如何捕获异常

c++ - 如何在 boost::beast 上保持 websocket?

c++ - 在 C++ 中初始化自定义类的 vector

matlab 返回向量中每第二次出现的值