【问题标题】:Idiomatic way to create a vector of pointers in C++11?在 C++11 中创建指针向量的惯用方法?
【发布时间】:2013-11-22 05:59:05
【问题描述】:

假设我想在 C++11 中创建一个包含 10 个指针的 std::vector,每个指针都指向一个默认构造的类 Foo 实例。这是一种方法:

std::vector<Foo*> foos;
for (int i = 0; i != 10; ++i) {
    foos.push_back(new Foo());
}

有避免for循环的惯用方法吗?

【问题讨论】:

    标签: c++ pointers c++11 vector


    【解决方案1】:

    有避免for循环的惯用方法吗?

    不是真的。但是,您的代码不是惯用的 C++11,因为它使用 new 而没有 unique_ptr。不要那样做。事实上,从 C++14 开始,您应该考虑在普通代码中弃用 new 的常规用法(因为 C++14 引入了 make_unique)。

    【讨论】:

    【解决方案2】:

    如果您想避免显式的for 循环,那么是的,有一种方法。

    使用std::generategenerate_n

    std::generate_n(std::back_inserter(foos), 10, [] { return new Foo(); });
    

    这看起来很惯用。

    好吧,不管是否循环,这几乎是一种选择。但是不再推荐使用原始指针,因为在没有 RAII 的情况下很难避免泄漏它们。根据需要使用智能指针,例如 std::unique_ptrstd::shared_ptr

    std::vector<std::unique_ptr<Foo>> foos;
    std::generate_n(std::back_inserter(foos), 10, [] { return std::unique_ptr<Foo>(new Foo()); });
    

    在 C++14 中,您可以使用std::make_unique。所以你可以完全放弃new

    希望对您有所帮助。

    【讨论】:

    • 如何在不使用new 的情况下初始化智能指针?我错过了什么吗?
    • @JonasWielicki:嗯,我的意思是,没有将它包装在智能指针中。在 C++14 中,您可以在不使用 new 的情况下做到这一点。
    • @Nawaz:是的,这就是我所追求的。谢谢!
    • @Nawaz 谢谢你的解释,不知道C++14的那个特性。
    • 请注意,在 C++11 中编写(更简单的)make_unique 相对容易:template&lt;typename T, typename... Args&gt; std::unique_ptr&lt;T&gt; my_make_unique(Args&amp;&amp; args) { return {new T(std::forward&lt;Args&gt;(args)...)}; }。据我所知,C++1y make_uniquestd::unique_ptr&lt;T[]&gt; 支持下做了一些奇特的事情。
    【解决方案3】:

    没有人提到标准算法std::generate_n。所以你可以写

    const size_t N = 10;
    
    std::vector<foo *> foos;
    foos.reserve( N );
    
    std::generate_n( std::back_inserter( foos ), N, [] { return new foo(); };
    

    当然实际上是同一个循环。:)

    【讨论】:

    • 对不起。当我写我的帖子时,有人已经指出 std::generate_n.:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    相关资源
    最近更新 更多