C++ 创建共享指针向量元素指向的对象的副本

C++ 创建共享指针向量元素指向的对象的副本,c++,c++11,vector,shared-ptr,smart-pointers,C++,C++11,Vector,Shared Ptr,Smart Pointers,我有一个类customClass1,其属性是std::vector 如何制作customClass1对象的副本,该对象包含指向第一个std::vector元素指向的对象的相同副本的指针 我不想简单地复制向量中包含的指针。我想复制指针指向的对象,然后将指向这些新对象的指针存储在我的第二个customClass1对象的vector属性中。您需要做的是遍历要复制的向量,并创建新的共享对象,这些对象与要复制的向量中的基础对象具有相同的值。您可以通过以下方式实现: std::vector<std::

我有一个类
customClass1
,其属性是
std::vector

如何制作
customClass1
对象的副本,该对象包含指向第一个
std::vector
元素指向的对象的相同副本的指针


我不想简单地复制向量中包含的指针。我想复制指针指向的对象,然后将指向这些新对象的指针存储在我的第二个
customClass1
对象的vector属性中。

您需要做的是遍历要复制的向量,并创建新的
共享对象,这些对象与要复制的向量中的基础对象具有相同的值。您可以通过以下方式实现:

std::vector<std::shared_ptr<customClass2>> original; // this has the data to copy
std::vector<std::shared_ptr<customClass2>> copy;
copy.reserve(original.size()); // prevent reallocations

for (const auto& e : original)
    copy.push_back(std::make_shared<customClass2>(*e));
std::vector original;//这有要复制的数据
std::向量拷贝;
copy.reserve(original.size());//防止重新分配
用于(const auto&e:原件)
复制。推回(标准::使共享(*e));

如果你正在处理一个多态类型,这将切片对象,因为你有一个指向底部的指针,所以只有低音部分将被复制。如果您使用的是多态类型,则可以创建一个
virtual
clone函数,并使用
clone()
复制对象。有关这方面的更多信息,请参见

上的,您询问的内容有点不清楚。共享指针可以被取消引用(例如,使用
*
操作符)来创建包含对象的副本,这些副本存储在向量中似乎大部分是无关的。我想我想问的是,是否有一种方法可以做到这一点,而无需迭代每个元素并取消引用,即自动创建指向对象的副本,但是有了新的指针。不,那是不可能的。向量的一个简单副本复制共享的\u ptr,而不是它们包含的对象。所以我必须手动迭代向量并取消引用来创建副本?是否没有办法自动创建指向对象的副本,但使用新指针?如果我使用
unique\u指针
?@NewDogOldTricks,您将无法复制它。@NewDogOldTricks情况也一样。您可以使用
std::tranform
进行复制,但基本上是一样的,您需要使用lambda进行复制。@NathanOliver谢谢,这很有意义!预先准备一个
保留区
,并简要介绍一下切片的潜力就好了。