イテレータが反復処理中の基底オブジェクトを保持しているかどうかについて多くの情報を見つけることはできません。C++イテレータは、基礎となるオブジェクトへの参照を保持していますか?
イテレータを作成すると、それを供給したオブジェクトが有効範囲外になります。イテレータが存在すると、イテレータが破棄されませんか?この例では
// This class takes a copy of iterators to use them later
class Data {
public:
Data(std::vector<int>::iterator start, std::vector<int>::iterator end)
: start(start),
end(end)
{}
void show() {
// Use this->start and this->end for some purpose
}
private:
std::vector<int>::iterator start;
std::vector<int>::iterator end;
};
Data test() {
std::vector<int> v{1, 2, 3};
Data d(v.begin(), v.end());
d.show(); // this would be ok
return d;
}
int main(void) {
Data d = test();
d.show(); // What happens here?
}
、Data
オブジェクトが最初show()
コールの罰金ですイテレータのコピーが、保管されています
はここだけのシナリオを説明するために非常に簡単な例です。しかし、第2のshow()
呼び出し時までに、イテレータを提供した元のオブジェクトは存在しなくなりました。
イテレータは、オブジェクト自体がすべて破壊されるまでオブジェクトを保持しますか、または元のオブジェクトが有効範囲外になるとすぐにイテレータを無効にしますか?ここで
は一つの方法または他の何が起こるか言っていないone reference of manyである(またはこれの結果は「未定義」されていてもか。)
イテレータはポインタでモデル化されています。大まかに言えば、ポインタが高レベルのものXを実行できない場合、イテレータはどちらもできません。 –
はい、イテレータは無効になり、結果は未定義です。 – songyuanyao
特定の状況に対処するには、コンテナを破棄すると、すべてのイテレータが無効になります。 –