スプライスはどのように機能しますか? http://www.cplusplus.com/reference/list/list/splice/でそれについて読みました
上記のリンクのコードからこの部分を理解できませんでした:
mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
スプライスはどのように機能しますか? http://www.cplusplus.com/reference/list/list/splice/でそれについて読みました
上記のリンクのコードからこの部分を理解できませんでした:
mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
次の内容の整数のリストがあるとします。
[1, 2, 3, 4, 5]
ここで、というリストにイテレータを作成し、itそれを3つの位置に進めます。
[1, 2, 3, 4, 5]
^
'it' points here
it次に、リストをそれ自体に、リストの最初(最初のパラメーター)、同じリスト(2番目のパラメーター)、 (3番目のパラメーター)が指す位置から最後(4番目のパラメーター)までスプライスします。これにより、次の結果が得られます。
[4, 5, 1, 2, 3]
したがって、2つの要素のリストを効果的に右に回転させました。
スプライス関数の4番目のパラメーターは、範囲を1番目のパラメーターで指定された位置に移動します(コピーしません)。
この例では、リストの要素をリスト内の別の位置に移動しています(より正確には、リストの最後から最初に移動します)。
void list<T,Allocator>::splice ( iterator position, list<T,Allocator>& x, iterator i );
void list<T,Allocator>::splice ( iterator position, list<T,Allocator>& x, iterator start, iterator finish );
2 つのリストと 2 つのイテレータがあるため、見ただけではわかりにくいです。
しかし、言葉positionはそれを与えます。を実行する場所を示していinsertます。
移動するのはイテレータiです。start2 番目のオーバーロードでは、 toからの範囲が移動されますが、それ自体は移動されfinishません。リストの終わりかもしれません。finishfinish
はリストpositionに属している必要がありthisます。イテレータはリストに属している必要がありxます。要素はソース (this) リストの直前に挿入さpositionれ、同時にxリストから削除されます。
cplusplus.com では、イテレータはスプライスされると無効になると記載されていますが、実際にはそうではなく、有効なままです。
cplusplus.com はposition、スプライスされた要素の 1 つではない可能性があるという点で正しいです (リストが同じ場合)。
あなたの例では:
mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
itmylist1 内の反復子でなければなりません。であってはならないようmylist1.begin()です。
この操作により、すべての要素itがリストの先頭に移動します。