「 list::splice 」がどのように機能するかを読んでいますが、何かがわかりません。
mylist1.splice (it, mylist2); // mylist1: 1 10 20 30 2 3 4
// mylist2 (empty)
// "it" still points to 2 (the 5th element)
mylist2.splice (mylist2.begin(),mylist1, it);
// mylist1: 1 10 20 30 3 4
// mylist2: 2
// "it" is now invalid.
it = mylist1.begin();
std::advance(it,3); // "it" points now to 30
mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
// mylist1: 30 3 4 1 10 20
1番目と3番目のスプライスでは、itイテレータは引き続き有効ですが、2番目のスプライスではなぜそうではないのでしょうか。
ドキュメントによると:
イテレータの有効性
呼び出し前に、コンテナーに関連するイテレーター、ポインター、および参照に変更はありません。転送された要素を参照するイテレーター、ポインター、および参照は、同じ要素を参照し続けますが、イテレーターは、要素が転送されたコンテナーを反復処理するようになりました。
したがって、それはまだ有効であるはずです