2016-06-16 18 views
8

constexprサイズを指定する必要がない場合、std::array<...>の最適な置き換えは何ですか?私はstd::vectorを使用してreserve(...)を実行するのが最善であると考えましたが、多分私は何かを見落としていますか?std :: arrayのC++置換

+3

固定サイズ['std :: dynarray'](http://en.cppreference.com/w/cpp/container/dynarray)の提案がありました。残念ながら、それはC++ 14にはなりませんでした。 – juanchopanza

+0

委員会はなぜそれを受け入れることを決定しなかったのですか?私はそれが実験的であることを見て、それはおそらくまだチャンスを立てていることを意味します。 –

答えて

7

はい、std::vectorを使用し、[ "とても遅い標準コンテナであるのはなぜ?" の下を参照してください]。だから、

あなたのコードが

std:array<int, 42> my_array; 

std:vector<int> my_array(42); 

ノートでそれを置き換えている場合:それは空のvectorを離れるので、あなたはおそらく、reserveを使用する必要はありません。 std::arrayを使用している場合、コードに空の配列の概念がないため、構築時に塗りつぶされたstd::vectorインスタンスで最もよく表現され、サイズは変更されません。

+1

'std :: vector 'では、初期容量を指定する代わりに 'resize(42)'を使うかもしれません。 'my_array(42)'では、 '42'が最初の要素だと思う人や、 'my_array {42}'に変更して静かに壊すことに心配しています。 – user2357112

+0

この小さな問題は、ベクトルをゼロで塗りつぶすのに対し、例の配列の宣言では初期化されていないということです。これは、ベクトルが大きなサイズを持つことが予想される場合には重要です。 – Ruslan

17

std::vectorは、実行時にサイズを決定する必要がある場合は、適切なコンテナである必要があります。

4

std::vector<>おそらくあなたの答えです。私はちょうどreserve()がどんなスピードアップを保証すると仮定しないでしょう。

ビャーネ・ストロヴストルップは:

人々は時々インクリメンタル を成長のstd ::ベクトルのコストを心配します。私はそのことを心配していましたが、 にはreserve()を使って成長を最適化しました。私のコードを測定して、実際に プログラムでreserve()のパフォーマンス上の利点を見つけるのに苦労して を持っていたら、 イテレータの無効化(私のコードではまれなケース)を回避する必要がある場合を除いて、再び: の前に測定して最適化します。

http://www.stroustrup.com/bs_faq2.html

+0

私はほとんどの場合、 'reserve'を呼び出すことはスピードアップを保証することではないことを示しています(コールを省略するとそのSTLが"減速を保証する "ということを意味します)。明らかです。何らかの理由でそれをそのサイズに構築することはできませんが、それを満たすために繰り返しの 'push_back'が必要な場合でも、割り当て時間にベクトルの正確な大きさを知ることがよくあります。そして、 'reserve'を呼び出さないと、一致が見つかったときに線形検索を中断しないようになります。スピードアップは小さいかもしれませんが、改善は明らかです。 –

関連する問題