スプライスはどのように機能しますか? 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
です。start
2 番目のオーバーロードでは、 toからの範囲が移動されますが、それ自体は移動されfinish
ません。リストの終わりかもしれません。finish
finish
はリストposition
に属している必要がありthis
ます。イテレータはリストに属している必要がありx
ます。要素はソース (this) リストの直前に挿入さposition
れ、同時にx
リストから削除されます。
cplusplus.com では、イテレータはスプライスされると無効になると記載されていますが、実際にはそうではなく、有効なままです。
cplusplus.com はposition
、スプライスされた要素の 1 つではない可能性があるという点で正しいです (リストが同じ場合)。
あなたの例では:
mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
it
mylist1 内の反復子でなければなりません。であってはならないようmylist1.begin()
です。
この操作により、すべての要素it
がリストの先頭に移動します。