是否可以使用fill构造函数创建std :: vector <std :: unique_ptr <Bar >>?

菲利普·S。

我有一个Foo类,其成员变量类型为std::vector<std::unique_ptr<Bar>>,我想填写该类的构造函数的初始化列表。这可能吗?

我希望可以使用vector的fill构造函数,像这样

Foo::Foo(int n):
    vector<unique_ptr<Bar>> (n, unique_ptr<Bar> (new Bar))
{}

但是我认为这需要复制构造函数std::unique_ptr,该构造函数应被删除(应该是)(unique_ptr(const unique_ptr&) = delete)。

有没有更好的方法来解决这个问题?

乌玛·赫尔法维

由于它不可复制,请移动它!

硬编码对象的解决方案:

#include <memory>
#include <vector>
#include <iterator>
class Bar{};
class Foo{
    public:
    Foo():bars(get_bars()) {}
    std::vector<std::unique_ptr<Bar>> bars;

    private:
    std::vector<std::unique_ptr<Bar>> get_bars(){
        std::unique_ptr<Bar> inilizer_list_temp[]={std::make_unique<Bar>(),std::make_unique<Bar>(),std::make_unique<Bar>()};
        return  std::vector<std::unique_ptr<Bar>>{std::make_move_iterator(std::begin(inilizer_list_temp)),std::make_move_iterator(std::end(inilizer_list_temp))};
    }
};
int main()
{
    Foo foo;
}

现场演示

动态对象数的解决方案:

#include <memory>
#include <vector>
#include <iterator>
#include <iostream>
class Bar{
    public:
    int a=5;
    };
class Foo{
    public:
    Foo():bars(get_bars(10)) {}
    std::vector<std::unique_ptr<Bar>> bars;

    private:
    std::vector<std::unique_ptr<Bar>> get_bars(int n){
        std::vector<std::unique_ptr<Bar>> inilizer_list_temp;
        inilizer_list_temp.reserve(n);
        for(size_t i=0;i<n;++i){
            inilizer_list_temp.emplace_back(std::make_unique<Bar>());
        }
        return inilizer_list_temp;
    }
};
int main()
{
 Foo foo;
 for(auto const& item:foo.bars){
     std::cout << item->a;
 }
}

现场演示

并查看此内容以获取更多详细信息。我可以列表初始化仅移动类型的向量吗?

编辑:

对于没有std :: make_uniuqe的C ++ 11用户:

template<typename T, typename ...Args>
std::unique_ptr<T> make_unique( Args&& ...args )
{
    return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
}

资源

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

调整大小std :: vector <std :: unique_ptr <T >>的性能

std :: vector <std :: unique_ptr <int>>不编译

C ++-vector <>中的std :: unique_ptr为nullptr

构造类成员std :: vector <std :: unique_ptr <AClass>的智能方法

将std :: vector <std :: unique_ptr <T >>分配给另一个std :: vector <std :: unique_ptr <T >>

如何调整std :: vector <std :: queue <std :: unique_ptr <int >>>的大小?

std :: remove_if来自std :: vector的多态std :: unique_ptr

如何检查std :: unique_ptr是否为空(如果它位于std :: vector中)?

使用`std :: unique_ptr`时`std :: vector`中的数据不同

使用std :: vector <double>访问由std :: unique_ptr <double [2]>管理的数据

std :: unique_ptr constexpr构造函数

std :: unique_ptr构造函数的行为

将std :: unique_ptr推回std :: vector时,编译器不会失败

'operator[]' 不匹配(操作数类型是 'std::unique_ptr<std::vector<int> >' 和 'int')

还有什么更好的替代std :: vector <std :: unique_ptr <T >>吗?

声明包含std :: unique_ptr的结构的std :: vector类时出错

std :: vector <std :: unique_ptr <>> :: push_back()的正确语法是什么?

如何构造一个具有“unique_ptr”作为成员变量的对象的“std::vector”?

如何使用std :: vector <unique_ptr <T >>作为默认参数

std :: unique_ptr :: release()与std :: move()

std :: unique_ptr与std :: map

如果没有noexcept move构造函数,为什么带有std :: vector的代码不能编译却带有std :: unique_ptr的代码可以编译?

std :: vector <unique_ptr <class T >>的动态初始化

在 Qt 上使用 std::unique_ptr

返回对std :: unique_ptr的引用的原因

is_assignable和std :: unique_ptr

通过unique_ptr访问std :: array

指向std :: unique_ptr的内容

std :: unique_ptr和QObject :: deleteLater