2017-10-26 24 views
2

std::vector::push_back()を呼び出すときに、実際に必要なメモリをさらに割り当てることが再配分の仕組みで分かっています。 通常容量が想定...乗数2倍または黄金比数と〜1.618でstd :: vector :: resizeとstd :: vector :: push_backで償却する

を育て、次のように、私たちは、要素を追加します。

std::vector<int> v; 
for(unsigned i = 0; i < 100000; ++i) 
{ 
    v.resize(v.size() + 1); 
} 

は、それは、ベクターの容量が "であることが保証されています再配分が行われる場合は「倍増」されますか? つまり、「+1サイズ変更」はpush_backの場合と同じ方法でメモリを割り当てますか?

純粋な実装依存のものですか?

+1

私はこの質問を理解しません。あなたはすでに、容量は通常2倍(すなわち倍増)**または**黄金比で増加すると述べています。 – user463035818

+0

@ tobi303私はOPが 'push_back'と比較して' resize'について質問していると思います。 –

+1

@ChrisDrewああ、今私は質問を理解しています;)、私はまだ改善することができると思うが – user463035818

答えて

1

再割り当てが行われると、ベクトルの容量が「倍増」されることは保証されますか?

いいえ。メモリの再割り当ての複雑さは、一定に償却されます。必要に応じてオブジェクトの容量が倍増するか、別の要因によって増加するかは、実装に依存します。

「+1サイズ変更は、」メモリにそれが一back

はいのために行われているのと同じ方法を割り当てます。

std::vector::resize(size_type sz)は、szsize()より大きい場合、値に初期化された要素をシーケンスに追加します。 - 一定の償却

insert(end(), sz-size(), <value initialized object>); 

std::vector::insertstd::vector::emplace、およびstd::vector::push_backメモリ割り当てのために同じ複雑さを持っている:それは同等です。

+3

OPは 'resize'について質問しています。 –

+0

@ChrisDrew、更新された回答を参照してください。 –

+0

あなたの「いいえ」は「倍増」という言葉にしか反応せず、OPの本当の疑問は(サイズ変更がpush_backと同じ償却された一定の動作をしているかどうか)ではないと私は思います。あなたの最後の文章(あなたが2以外の要因が可能であることを説明しているところ)を最初のものの隣に移動します。 「倍増」という言葉は引用符で囲まれており、OPはすでに他の考えられる要因について言及しており、彼の肩書きに償却語を使用しています。 –

0

ベクトルは、末尾に一定時間の挿入と削除操作をサポートする(償却された)定数 のシーケンスコンテナです。 配列のサイズ()デフォルト挿入要素 - [vector.overview]

サイズIF()< SZ、SZを付加します。

(リサイズ用) IMHOは、再割り当てが行われた場合、ベクターの容量が「倍増」されることを保証します。

関連する問題