包含 unordered_map of unique_ptr 对象的深拷贝
deep copy of objects containing unordered_map of unique_ptr
我有以下情况:
我需要从类型 A
创建变量的深 (!) 副本。此变量包含类型 B
的向量。 Class B
不可复制,因为它包含一个 std::unordered_map
,其值为 unique_ptr
(不可复制)。我想避免通过复制构造函数或复制赋值运算符使 B
可复制。
一个问题是 unique_ptr
的类型只是基本类型。实际对象派生自 C
并包含不同的成员和不同的构造函数。
class A{
public:
A(const A&); // how should I implement this?
A& operator=(const A&); // how should I implement this?
private:
vector<B> vectorOfB;
}
class B{
private:
std::unordered_map<std::string, std::unique_ptr<C> mapOfDerivedTypesOfC;
}
class C{}
class C_1: public C{
public:
C_1(double x)
}
class C_2: public C{
public:
C_2(double y, double z)
}
背景:
class A 的目的是读取大量带有数据的大型文本文件并创建许多对象。
之后我必须 运行 对这个对象进行蒙特卡洛模拟。对于每个模拟,我都需要 A 的新副本。
我不想每次都读入所有的文本文件,因为这很耗时。因此,有必要对 A 进行深度复制。在一次模拟中,我想避免复制 B,因为复制此对象毫无意义。我认为使用 sharded_ptr 无济于事,因为我需要深度复制和使用 openMP 并行模拟 运行。
编辑:
我认为总体问题是我应该如何复制 unordered_map
长话短说,您需要在 C
中为每个继承 class 的对象编写一个虚函数来覆盖。像
virtual std::unique_ptr<C> anotherOnePlease() = 0;
然后你可以在每个C *
上使用这个函数,并创建一个新地图。有点糟糕,但是如果你为每个派生 C
.
实现这个函数,至少你可以编写一个简单的函数来复制地图
我认为该技术被称为 "virtual copy constructor":
// in baseclass
public:
unique_ptr<Base> clone() const
{
unique_ptr<Base> other(this->do_clone());
assert(typeid(*this) == typeid(*other));
return other;
}
private:
virtual Base* do_clone() const = 0;
// in derived class
private:
virtual Derived* do_clone() const
{
return new Derived(*this);
}
这个想法是,一个类型最终拥有如何克隆其自身实例的信息,因此您可以通过虚函数将克隆委托给它。该断言确保派生的 class 正确地 implements/overrides baseclass 实现。
我有以下情况:
我需要从类型 A
创建变量的深 (!) 副本。此变量包含类型 B
的向量。 Class B
不可复制,因为它包含一个 std::unordered_map
,其值为 unique_ptr
(不可复制)。我想避免通过复制构造函数或复制赋值运算符使 B
可复制。
一个问题是 unique_ptr
的类型只是基本类型。实际对象派生自 C
并包含不同的成员和不同的构造函数。
class A{
public:
A(const A&); // how should I implement this?
A& operator=(const A&); // how should I implement this?
private:
vector<B> vectorOfB;
}
class B{
private:
std::unordered_map<std::string, std::unique_ptr<C> mapOfDerivedTypesOfC;
}
class C{}
class C_1: public C{
public:
C_1(double x)
}
class C_2: public C{
public:
C_2(double y, double z)
}
背景: class A 的目的是读取大量带有数据的大型文本文件并创建许多对象。 之后我必须 运行 对这个对象进行蒙特卡洛模拟。对于每个模拟,我都需要 A 的新副本。 我不想每次都读入所有的文本文件,因为这很耗时。因此,有必要对 A 进行深度复制。在一次模拟中,我想避免复制 B,因为复制此对象毫无意义。我认为使用 sharded_ptr 无济于事,因为我需要深度复制和使用 openMP 并行模拟 运行。
编辑: 我认为总体问题是我应该如何复制 unordered_map
长话短说,您需要在 C
中为每个继承 class 的对象编写一个虚函数来覆盖。像
virtual std::unique_ptr<C> anotherOnePlease() = 0;
然后你可以在每个C *
上使用这个函数,并创建一个新地图。有点糟糕,但是如果你为每个派生 C
.
我认为该技术被称为 "virtual copy constructor":
// in baseclass
public:
unique_ptr<Base> clone() const
{
unique_ptr<Base> other(this->do_clone());
assert(typeid(*this) == typeid(*other));
return other;
}
private:
virtual Base* do_clone() const = 0;
// in derived class
private:
virtual Derived* do_clone() const
{
return new Derived(*this);
}
这个想法是,一个类型最终拥有如何克隆其自身实例的信息,因此您可以通过虚函数将克隆委托给它。该断言确保派生的 class 正确地 implements/overrides baseclass 实现。