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

时间:2013-11-10 11:45:41

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

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

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

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

3 个答案:

答案 0 :(得分:17)

如果你想避免明确的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

希望有所帮助。

答案 1 :(得分:8)

  

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

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

答案 2 :(得分: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(); };

当然实际上它是相同的循环。:)