首页 > 解决方案 > 通过克隆另一个容器的元素来创建智能指针容器

问题描述

我有一个类,它支持克隆(通过方法clone)。我在一个向量中有一堆它的实例std::unique_ptr

现在,我想std::set从上面的向量中创建一个相同的智能指针,最好是在它的构造过程中。明显的设计如下:

#include <memory>
#include <set>
#include <vector>

class A
{
public:
    /// type of itself
    typedef A self;
    A() = default;
    A(const self& another) = default;
    virtual ~A() = default;

    std::unique_ptr<A> clone() const
    {
        return std::make_unique<A>();
    }
};

class SetOfA
{
public:
    SetOfA() = default;

    // Here is the method I would like to improve
    SetOfA(const std::vector<std::unique_ptr<A> >& data)
    {
        //do not like this loop, prefer this to be in initialization part?
        for (const auto& d : data) {
            set_of_a.insert(std::move(d->clone()));
        }
    }

private:
    std::set<std::unique_ptr <A> > set_of_a;
};

但是有没有办法避免for构造函数中的这个循环并将std::set构造移动到初始化部分?

标签: c++stdvectorstdset

解决方案


如果您可以使用 Boost,这是一个可能的解决方案:

SetOfA(const std::vector<std::unique_ptr<A>>& data) :
    set_of_a(
        boost::make_transform_iterator(data.begin(), std::mem_fn(&A::clone)),
        boost::make_transform_iterator(data.end(),   std::mem_fn(&A::clone)))
    { }

推荐阅读