4

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ループを回避する慣用的な方法はありますか?

4

3 に答える 3

16

明示的なループを回避したい場合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完全に放棄することができます。

それが役立つことを願っています。

于 2013-11-10T11:58:18.123 に答える
8

forループを回避する慣用的な方法はありますか?

あまり。ただし、コードを使用していないため、コードは慣用的なC++ 11 ではありません。そうしないでください。実際、C++14 では、通常のコードで deprecated を従来どおり使用することを検討する必要があります (C++14 では が導入されているため)。newunique_ptrnewmake_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 に答える