C++11 で 10 個のポインターを作成しstd::vector
、それぞれが class のデフォルトで構築されたインスタンスを指すとしますFoo
。これを行う1つの方法は次のとおりです。
std::vector<Foo*> foos;
for (int i = 0; i != 10; ++i) {
foos.push_back(new Foo());
}
for
ループを回避する慣用的な方法はありますか?
明示的なループを回避したい場合for
は、はい、方法があります。
std::generate
またはを使用generate_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
完全に放棄することができます。
それが役立つことを願っています。
for
ループを回避する慣用的な方法はありますか?
あまり。ただし、コードを使用していないため、コードは慣用的なC++ 11 ではありません。そうしないでください。実際、C++14 では、通常のコードで deprecated を従来どおり使用することを検討する必要があります (C++14 では が導入されているため)。new
unique_ptr
new
make_unique
標準アルゴリズム 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(); };
もちろん、実際には同じループです。:)