2012-12-12 51 views

回答

4

想象一下,你有一個整數包含以下內容的列表:

[1, 2, 3, 4, 5] 

現在您在列表中創建一個名爲it的迭代器,並將其前進3個位置:

[1, 2, 3, 4, 5] 
     ^
      'it' points here 

那麼拼接列表到自身,以列表的開始(第一個參數),在同一列表(第二個參數),從it(第三個參數)所指出的位置,到最後(第四個參數),這使結果如下:

[4, 5, 1, 2, 3] 

因此,您有效地將兩個元素的列表右移。

+0

不,我的問題(mylist1,it' in this ... mylist1.splice(mylist1.begin(),mylist1,it,mylist1.end()); – Saikiran

+0

我已經回答說,mylist1(第二個參數)必須是與mylist1對象相同類型的元素,因此mylist1是最好的候選者,並且'it'是同一個列表中的迭代器 – SirDarius

+0

我認爲問題是爲什麼是第二個和第三個拼接函數版本所需的第二個參數('x')。 –

1

splice函數的第四個參數將範圍移動(不復制)到第一個參數指定的位置。

在你的榜樣你移動你的列表的元素到另一個位置在列表中(更準確地說是列表的末尾到開頭)。

3

您需要提供源list的原因是,否則元件不能從它被移除。

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迭代器是被什麼感動。在第二次過載時,範圍從startfinish但不是finish本身被移動。 finish可能是列表的結尾。

position必須屬於this列表。迭代器必須屬於x列表。元素插入源(此)列表中的position之前,並且同時從x列表中刪除。

注意cplusplus.com指出迭代器變得無效,一旦拼接然而,這是不實際的情況下,他們也仍然有效。

cplusplus.com是,所述position正確可能不是剪接元件(在的情況下的列表是相同的)

在您的例子之一:

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

it必須mylist1中的迭代器。它會出現它不能是mylist1.begin()

您的操作將從it開始的所有元素移動到列表的開頭。