C++11 C++;11复制作为成员的std::unique_ptr的std::vector

C++11 C++;11复制作为成员的std::unique_ptr的std::vector,c++11,vector,copy-constructor,unique-ptr,C++11,Vector,Copy Constructor,Unique Ptr,我有一个类图,它有一个成员: std::vector<std::unique_ptr<layer>> _layers; 如果我做了一个std::move,那么我将违反paramrhs的常量,这不是我想要的。 我知道我可以进行深度复制(例如,为存储在rhs.\u layers中的每个对象创建新的唯一指针),但是除了在rhs.\u layers中迭代每个项目并分配新的唯一指针之外,还有什么优雅的方法可以做到这一点吗 gcc/g++是c++11而不是c++14 我当前的解决方

我有一个类
,它有一个成员:

std::vector<std::unique_ptr<layer>> _layers;
如果我做了一个
std::move
,那么我将违反param
rhs
常量,这不是我想要的。 我知道我可以进行深度复制(例如,为存储在
rhs.\u layers
中的每个对象创建新的唯一指针),但是除了在
rhs.\u layers
中迭代每个项目并分配新的唯一指针之外,还有什么优雅的方法可以做到这一点吗

gcc/g++是c++11而不是c++14

我当前的解决方案是深度复制对象并分配新指针:

graph::graph(const graph & rhs)
{
   for (const auto & ptr : rhs._layers)
       _layers.emplace_back(std::unique_ptr<layer>(new layer(*ptr)));
}
graph::graph(常量图和rhs)
{
用于(常数自动和ptr:rhs.\U层)
_层。安放回(标准::唯一层(*ptr));
}

您不能复制,但可以移动:

graph::graph(graph && rhs)
您应该能够在其中移动
\u层
向量,然后您应该能够移动
图形
实例

如果这不是您想要的,那么您将不得不放弃使用
unique\u ptr
,或者在
\u layers
向量中添加一个间接层(如果可以在图形实例之间共享)


编辑:另一种解决方案是根本不在向量中使用指针,而是直接将实例放置到向量中。这样,向量将与所有内容一起自然复制。

您不能复制,但可以移动构造函数:

graph::graph(graph && rhs)
您应该能够在其中移动
\u层
向量,然后您应该能够移动
图形
实例

如果这不是您想要的,那么您将不得不放弃使用
unique\u ptr
,或者在
\u layers
向量中添加一个间接层(如果可以在图形实例之间共享)


编辑:另一种解决方案是根本不在向量中使用指针,而是直接将实例放置到向量中。这样,向量将与所有内容一起自然复制。

最优雅的解决方案将使用STL:

graph::graph(const graph & rhs)
{
    _layers.reserve(rhs._layers.size());
    std::transform(
        std::begin(rhs._layers),
        std::end(rhs._layers),
        std::back_inserter(_layers),
        [](const std::unique_ptr<layer>& uptr) {
            return std::unique_ptr<layer>{uptr ? new layer{*uptr} : nullptr};
        });
}
graph::graph(常量图和rhs)
{
_图层保留(rhs._layers.size());
std::transform(
标准::开始(rhs._层),
标准:端部(rhs._层),
标准:背面插入器(_层),
[](const std::unique_ptr&uptr){
返回std::unique_ptr{uptr?新层{*uptr}:nullptr};
});
}


最优雅的解决方案将使用STL:

graph::graph(const graph & rhs)
{
    _layers.reserve(rhs._layers.size());
    std::transform(
        std::begin(rhs._layers),
        std::end(rhs._layers),
        std::back_inserter(_layers),
        [](const std::unique_ptr<layer>& uptr) {
            return std::unique_ptr<layer>{uptr ? new layer{*uptr} : nullptr};
        });
}
graph::graph(常量图和rhs)
{
_图层保留(rhs._layers.size());
std::transform(
标准::开始(rhs._层),
标准:端部(rhs._层),
标准:背面插入器(_层),
[](const std::unique_ptr&uptr){
返回std::unique_ptr{uptr?新层{*uptr}:nullptr};
});
}



您还可以查看使用std::shared\u ptr而不是std::unique向量的可能性,在这种情况下,您可以避免真正的复制

您还可以查看使用std::shared\u ptr向量而不是std::unique向量的可能性,在这种情况下,您可以避免真正的复制

这已经在这里讨论过了:未经教育的猜测:这是否是一个好的用例,用于
弱的\u ptr
s查看
共享的\u ptr
s?@Katana314我不知道TBH,但是这些指针在课堂外是看不到或访问的。我不介意复制对象(因此是深度复制)。在这种情况下,
弱\u ptr
的优点是什么?@Alex与共享\u ptr不同,
\u layers
变量仍然是实际
层的所有者引用。如果它被破坏了,物体也会被破坏。缺点是,从
弱ptr
的每次访问都需要在一个条件语句中,以确认该层尚未被破坏。此外,编译器也不能保证以前唯一的指针不会被复制到另一个共享的\u ptr中(因此这将由您来保护)。如果您不想移动语义,也许独特的ptr不是最好的选择。这里已经讨论过了:未受过教育的猜测:这是否是
弱的ptr
s能够查看
共享的ptr
s的一个很好的用例?@Katana314我不知道TBH,但是这些指针在课堂外是看不到或访问不到的。我不介意复制对象(因此是深度复制)。在这种情况下,
弱\u ptr
的优点是什么?@Alex与共享\u ptr不同,
\u layers
变量仍然是实际
层的所有者引用。如果它被破坏了,物体也会被破坏。缺点是,从
弱ptr
的每次访问都需要在一个条件语句中,以确认该层尚未被破坏。此外,编译器也不能保证以前唯一的指针不会被复制到另一个共享的\u ptr中(因此这将由您来保护)。如果您不想移动语义,那么唯一的\u ptr可能不是最佳选择。这违反了使用const对象参数的全部要点。此外,我对移动而不是复制不感兴趣。@Alex那么首先你不应该使用
std::unique\u ptr
。在这里使用指针有什么原因吗?你能把实例放在向量中吗?这违背了使用const对象参数的要点。此外,我对移动而不是复制不感兴趣。@Alex那么首先你不应该使用
std::unique\u ptr
。在这里使用指针有什么原因吗?你能把实例放在向量中吗?没有c++14,这和我正在做的是一样的。我想我的类型需要模板专门化。@Alex STL应该优先于原始循环,但这是相同的。更新为c++11友好版本。@BrianRodriguez,如果我有其他clas成员