4

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

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

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

4

3 回答 3

16

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

使用std::generategenerate_n

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

这看起来很地道。

好吧,无论是否循环,这几乎是一种选择。但是不再推荐使用原始指针,因为在没有 RAII 的情况下很难避免泄漏它们。根据需要使用std::unique_ptr或使用智能指针。std::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完全放弃。

希望有帮助。

于 2013-11-10T11:58:18.123 回答
8

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

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

于 2013-11-10T11:48:48.100 回答
1

没有人提到标准算法 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(); };

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

于 2013-11-10T12:04:18.223 回答