C++ STLコンテナを使用する場合、参照条件に値をアクセスする必要がある条件はありますか。 たとえば、次の関数呼び出し後に無効にされた参照はありますか?STLコンテナ内の永続参照
{
std::vector<int> vector;
vector.push_back (1);
vector.push_back (2);
vector.push_back (3);
vector[0] = 10; //modifies 0'th element
int& ref = vector[0];
ref = 10; //modifies 0'th element
vector.push_back (4);
ref = 20; //modifies 0'th element???
vector.clear();
ref = 30; //clearly obsurd
}
私はstlのほとんどの実装でこれがうまくいくことを理解していますが、私は標準宣言に必要なものに興味があります。
--edit:私は、C++用のSTXXL(http://stxxl.sourceforge.net/)ライブラリを試してみたかったが、私はコンテナによって返された参照は変更を加えずに読み込み、複数の上に永続的ではありませんでした、そのための互換性がないことに気づいたbecuase イム興味(しかし、表面的)私の既存のstlコードに。例:
{
std::vector<int> vector;
vector.push_back (1);
vector.push_back (2);
int& refA = vector[0];
int& refB = vector[1]; //refA is not gaurenteed to be valid anymore
}
私は、これは確かにない、100%の互換性、またはSTXXLコンテナは、私が危険な/実装に依存する方法で、全体の時間をSTLコンテナを使用していた場合ことを意味している場合を知りたいと思いました。
よくある質問http://algo2.iti.uni-karlsruhe.de/dementiev/stxxl/trunk/FAQ.html「外部メモリのデータ構造内の要素への参照を渡すべきではありません参照が使用されている場合、要素を含むブロックは内部メモリに存在しなくなる可能性があります。 "という回答がNOであるため、コンテナ要素の参照はSTLの対応と同じではありません。 – Akusete
C++標準を見てみると、すべてのコンテナはtypedefsの 'reference'、' const_reference'、 'pointer'と' const_pointer'を持っています。これらは基本となるアロケータの対応するtypedefにセットされています。標準委員会は最初、refsとポインタの抽象化を設定したいので、これらのものでもコンテナ(プロキシを使用している方法で)で「管理」することができましたが、途中で停止しました'allocator :: pointer'の型が' T * 'などであることを標準で規定しているので、typedef自体は最終的には無意味です。 –
私はほとんどのSTLコンテナのインターフェイスを読み込んで同じ感覚を持っていましたが、なぜそれらが半分にしかならなかったのかについてのディスカッションを見つけることができませんでした。 – Akusete