6

スプライスはどのように機能しますか? http://www.cplusplus.com/reference/list/list/splice/でそれについて読みました

上記のリンクのコードからこの部分を理解できませんでした:

mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
4

4 に答える 4

5

次の内容の整数のリストがあるとします。

[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つの要素のリストを効果的に右に回転させました。

于 2012-12-12T10:05:35.960 に答える
1

スプライス関数の4番目のパラメーターは、範囲を1番目のパラメーターで指定された位置に移動します(コピーしません)。

この例では、リストの要素をリスト内の別の位置に移動しています(より正確には、リストの最後から最初に移動します)。

于 2012-12-12T10:06:56.960 に答える
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がリストの先頭に移動します。

于 2012-12-12T10:27:01.630 に答える