矢量的独特副本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矢量的独特副本相关的知识,希望对你有一定的参考价值。

我有一个包含vector<unique_ptr>的类对象。我想要一个这个对象的副本来运行非const函数。原始副本必须保持const。

这样一个类的复制构造函数会是什么样的?

class Foo{
public:
 Foo(const Foo& other): ??? {}

 std::vector<std::unique_ptr> ptrs;
};
答案

您不能简单地复制std::vector<std::unique_ptr>,因为std::unique_ptr不可复制,因此它将删除矢量复制构造函数。

如果你不改变存储在矢量中的类型,那么你可以通过创建一个全新的矢量来制作一个“副本”

std::vector<std::unique_ptr<some_type>> from; // this has the data to copy
std::vector<std::unique_ptr<some_type>> to;
to.reserve(from.size()) // preallocate the space we need so push_back doesn't have to

for (const auto& e : from)
    to.push_back(std::make_unique<some_type>(*e));

现在tofrom的单独副本,可以单独更改。


另外:如果你的类型是多态的,那么上面的代码将无效,就像你有一个指向基类的指针一样。你需要做的是制作一个虚拟的clone成员函数,让clonestd::unique_ptr返回给实际派生对象的副本。这将使代码看起来像:

std::vector<std::unique_ptr<some_type>> from; // this has the data to copy
std::vector<std::unique_ptr<some_type>> to;
to.reserve(from.size()) // preallocate the space we need so push_back doesn't have to

for (const auto& e : from)
    to.push_back(e->clone());

以上是关于矢量的独特副本的主要内容,如果未能解决你的问题,请参考以下文章

C ++迭代矢量副本

矢量类型的模板类专业化 - 不同的有效语法?

为什么我不能在此片段中生成唯一对象数组?

以编程方式 Xcode 9 矢量图像

2d(3d)坐标的散列图(即双精度矢量)?

动态路由--RIP