C++ 与带指针项的向量副本相关的问题

C++ 与带指针项的向量副本相关的问题,c++,copy,depth,C++,Copy,Depth,我想问一下指针项向量的副本是否存在一些问题。我是否需要strcpy或memcpy,因为可能存在深度复制问题 例如: Class B; Class A { .... private: std::vector<B*> bvec; public: void setB(std::vector<B*>& value) { this->bvec = value; } }; void main() {

我想问一下指针项向量的副本是否存在一些问题。我是否需要strcpy或memcpy,因为可能存在深度复制问题

例如:

Class B;

Class A

{
   ....

private:
   std::vector<B*> bvec;

public:

   void setB(std::vector<B*>& value)

   {

      this->bvec = value;

   }

};

void main()

{

   ....

   std::vector<const B*> value; // and already has values

   A a;

   a.setB(value);

}
B类;
甲级
{
....
私人:
std::载体bvec;
公众:
无效收进(标准::向量和值)
{
此->bvec=值;
}
};
void main()
{
....
std::vector value;//并且已经有值
A A;
a、 挫折(价值);
}

本例仅将值分配给类内的类变量bvec。我是否需要使用memcpy,因为我发现std::vector bvec;有指针项吗?我对C++中的深度拷贝感到困惑,你能告诉我吗?谢谢。

考虑一下,如果在调用
setB
后从向量
值中删除一项,那么
A
中的向量将有一个不再有效的指针

因此,要么您需要进行“深度复制”,保证上述场景永远不会发生,要么使用共享智能指针(如,而不是原始指针)。如果你需要指点,我推荐最后一个


还有另一种选择,那就是将向量存储在
A
中,作为对实向量的引用。但是,这还有其他问题,比如实向量需要在对象的整个生命周期内都有效。但在这里,您也可以使用智能指针,动态分配向量。

想想看,如果在调用
setB
后从向量
值中删除一个项,那么
A
中的向量将有一个不再有效的指针

因此,要么您需要进行“深度复制”,保证上述场景永远不会发生,要么使用共享智能指针(如,而不是原始指针)。如果你需要指点,我推荐最后一个


还有另一种选择,那就是将向量存储在
A
中,作为对实向量的引用。但是,这还有其他问题,比如实向量需要在对象的整个生命周期内都有效。但在这里,您也可以使用智能指针,动态分配向量。

您不太可能需要strcpy或memcpy来解决问题。然而,我不确定你的问题是什么

我将尝试解释与std::vector相关的复制

当您将bvev指定给setB中的值时,您正在制作深度副本。这意味着向量中的所有元素都从value复制到bvec。如果有对象向量,则会复制每个对象。如果有指针向量,则会复制每个指针

另一种选择是,如果希望稍后引用元素,只需将指针复制到向量。只要小心,妥善管理生命周期


我希望这有帮助

您不太可能需要strcpy或memcpy来解决您的问题。然而,我不确定你的问题是什么

我将尝试解释与std::vector相关的复制

当您将bvev指定给setB中的值时,您正在制作深度副本。这意味着向量中的所有元素都从value复制到bvec。如果有对象向量,则会复制每个对象。如果有指针向量,则会复制每个指针

另一种选择是,如果希望稍后引用元素,只需将指针复制到向量。只要小心,妥善管理生命周期


我希望这有帮助

您可能希望为
A类
定义复制构造函数,以确保正确处理您询问的问题(尽管不是通过使用
memcpy
strcpy
)。在这里,始终遵循三个原则。我很肯定
std::vector
对你很好,但如果不是,那么就使用
for
循环而不是
memcpy
你可能想为
class a
定义复制构造函数,以确保你所问的问题得到正确处理(尽管不是通过使用
memcpy
strcpy
)。在这里,始终遵循三个原则。我很确定std::vector对你很好,但是如果不是,那么使用
for
循环而不是
memcpy

你的意思是std::vector操作符=()已经在低级别解决了这个深度复制问题?我的意思是“this->bvec=value;”将“value”向量中的每个项单独复制到“bvec”向量。但是,如果要存储指针,则只会复制指针本身。如果你想复制对象,你需要像这样写一个循环:
for(std::vector::iterator i=value.begin;i!=value.end;++i){this->bvec.insert(**i));}
其中bvec是std::vector你的回答:“如果你想复制对象,你需要像这样写一个循环:for(std::vector::迭代器i=value.begin;i!=value.end;++i){this->bvec.insert(**i));}其中bvec是std::vector“让我再次困惑。我认为在较低级别的std::vector已经解决了深度复制问题,因为我的问题只是将指针向量复制到另一个向量。@forester2012复制指针向量复制的是指针,而不是指针指向的实际对象。现在我明白了,如果是这样,我认为我仍然可以使用这些指针指向实际对象。您的意思是std::vector操作符=()已经在低级别解决了深度复制问题?我的意思是“this->bvec=value;”将“value”向量中的每个项单独复制到“bvec”向量。但是,如果存储指针,则只会复制指针本身。如果要复制对象,则需要编写如下循环:
for(std::vector::iterator i=value.begin;i!=value.end;++i){this->bvec.insert(*i));}
其中bvec是std::vector您的答案:“如果要复制对象,需要编写如下循环:for(std::vector::iterator i=value.begi