2011-12-22 9 views
2

私はベクトルを使用しています。私の目的のために、私は一般的にインデックス(]演算子を使って変更された&しかアクセスされない(n)要素を持つ必要があります。std :: vectorを変更可能な完全実装の配列として使用しますか?

ある点では、私のアルゴリズムはそれがより多くのスペースを必要とすると判断し、このベクトルを拡大してサイズを2倍にする必要があると判断します。

サイズを倍にして、ベクトル要素の型で初期化されたベクトルの既定のすべての新しい領域を持つ方法はありますか?

基本的には、倍増した後に容量を満たすために手動で要素を挿入するのではなく、容量全体が完全に占有され、デフォルト後に初期化されるようにしたいと思います。私が知っている限り、予約するだけでスペースが確保されます(そして、エレメントを初期化しないので、ループインサートを使用することができますが、もっと楽しい方法があると思います)。だから、

は、私はこのコンストラクタで新しいベクトルを作成するのと同様の効果をしたい:私はそれは同様のサイズで倍増する前に、ベクターに存在していた要素を維持したいと思い除い

std::vector<MyType> vec(2*oldvec.size(), MyType()); 

答えて

8

あなたはstd::vector::resize()をしたいです。

+0

私はそれを忘れているとは思えません。<カウントダウンが終了すると受け入れます:p –

2

お試しvec.resize(newsize, MyType())

0

他の回答で述べたように、ベクトルメソッドは、現在のベクトルのサイズを要求された値に設定します。指定されたサイズが大きいと仮定すると、新しいベクトルエントリには、指定されたデフォルト値のコピーが挿入されます。

ベクトルの拡張に十分な連続領域があると仮定すると、これは新しい大きなベクトルを作成して元の内容をコピーするよりも効率的です。

新しい要素の初期化はデフォルト値にする必要がありますか?そうでない場合は、問題を自分自身で救うことができます。また、オブジェクトがネイティブタイプでない場合は、ベクタの場所が必要になるまで初期化されないままにして、デフォルトを繰り返し作成するコストがかかります。その場合は、reserveメソッドを使用してベクトルにさらに多くの(初期化されていない)記憶領域を追加し、必要に応じてpush/popルーチンを使用してベクトルに新しい値を追加します。

+0

いいえ、ベクトルが初期化されたものを超えて要素を読み書きしません。それは未定義で、驚くべき振る舞いをします。 –

+0

合意。未定義の要素へのアクセスは悪く、私が提案しようとしているものではありません。 – Greg

+0

最後の文を明確にすることはできますか?それはあなたが示唆しているように聞こえる。 –

関連する問題