、その後、私はこれを行う値の束が移入されたベクトルポインタの位置は保証されていますか?
std::vector<int> numbers;
、私はint型のベクトルがあると言う(のエントリが43に存在する場合)
int *oneNumber = &numbers[43];
はに保証oneNumberです私がnumbers.resize(46)のようなものにリサイズすると言っても、常にインデックス43のintを指しているでしょうか?
期待される振る舞いがここにあるのを100%確信しているわけではありませんが、ベクトルが連続していることが保証されていることがわかりますが、その継続性がベクトルのすべてのインデックスを同じ生涯にわたって保持することを意味するかどうかはわかりません。
私は必然的に、ベクター内のオブジェクトへのポインタを必要とするので、私は、常に値-種類のベクトルを作成するには慎重だ。このため。だから、 'int * ref =&numbers [43]'のような参照を保存します。後で 'push_back'を' numbers'とWHAMMOに入れます!バグ: 'ref'は無効です。なぜなら、' numbers'は完全に別のメモリスペースに再割り当てされて保存されているからです。 – bobobobo
@bobobobo本当です。生成時に要素の数が分かっている(そして、いいえ、ループで値を生成するため 'std :: array'を使うことはできませんが)' reserve'はすべてのポインタ/イテレータを保証します現在の容量を超えてリサイズされない限り(再割り当てを強制し、それによって含まれる値のアドレスを移動させる可能性がある)、有効なままである。これは数回私を救ってくれました。しかし、私が覚えておくまで、私はいつも「予約する」ことを忘れて、しばらく私の頭を傷つけます。 :D –