在C++ 11中创建指针向量的惯用法?

use*_*866 4 c++ pointers vector c++11

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

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

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

Naw*_*waz 16

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

使用std::generategenerate_n:

std::generate_n(std::back_inserter(foos), 10, [] { return new Foo(); });
Run Code Online (Sandbox Code Playgroud)

这看起来很惯用.

好吧,循环与否,它几乎是一个选择.但不建议使用原始指针,因为很难避免在没有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()); });
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助.

  • 想为`std :: unique_ptr`提供另一个upvote (3认同)

Kon*_*lph 8

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

并不是的.但是,您的代码不是惯用的C++ 11,因为它new不使用unique_ptr.不要那样做.事实上,从C++ 14开始,你应该考虑new在普通代码中使用不推荐的常规代码(自C++ 14引入make_unique).

  • 在C++ 11中,你应该自己实现`make_unique`. (2认同)
  • 或者更好,使用Stephen T. Lavavej的版本.http://isocpp.org/files/papers/N3656.txt (2认同)