当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C++11复制作为成员的std::unique_ptr的std::vector》经验,为你挑选了1个好方法。

我有一个graph有成员的班级:

std::vector> _layers;

我理解其性质std::unique_ptr是不可复制的.我的graph::graph(const graph & rhs);拷贝构造函数产生编译错误,因为我的普通实现违反了本质std::unique_ptr.

graph::graph(const graph & rhs)
: _layers(rhs._layers) {}

如果我这样做,std::move那么我将违反param 的常量rhs,这不是我想要的.我知道我可以制作深层副本(例如,为存储的每个对象创建新的唯一指针rhs._layers)但除了迭代每个项目rhs._layers并分配新的唯一指针之外,还有一些优雅的方法吗?

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

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

graph::graph(const graph & rhs)
{
   for (const auto & ptr : rhs._layers)
       _layers.emplace_back(std::unique_ptr(new layer(*ptr)));
}

Brian Rodrig.. 5

最优雅的解决方案是使用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& uptr) {
            return std::unique_ptr{uptr ? new layer{*uptr} : nullptr};
        });
}

std::transform, std::back_inserter



1> Brian Rodrig..:

最优雅的解决方案是使用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& uptr) {
            return std::unique_ptr{uptr ? new layer{*uptr} : nullptr};
        });
}

std::transform, std::back_inserter

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有