因爲 list 容器不支持隨機訪問 所以 merge() remove() reverse() sort()和 unique()泛型算法最好不要用在 list 對象上 儘管這些算法都沒有顯式地要求一個 RandomAccessIterator標準庫爲每個算法都提供了專門的 list 成員實例 比如專門爲 list 的 splice()操作):
- list::merge() 用第二個有序的 list 合併一個有序 list
- list::remove() 刪除等於某個值的元素
- list::remove_if() 刪除滿足某個條件的元素
- list::reverse() 將 list 中元素反向排列
- list::sort() 排序 list 的元素
- list::splice() 把一個 list 的元素移到另一個 list 中
- list::unique() 刪除某個元素的重複連續拷貝
list::splice()
void list::splice( iterator pos, list rhs );
void list::splice( iterator pos, list rhs, iterator ix );
void list::splice( iterator pos, list rhs,iterator first, iterator last );
splice()把一個或一級元素從一個 list 移到另一箇中去 它有三種形式 把一個 list 的全部元素搬移到另一箇中去 把一個 list 中包含的一組元素搬移到另一箇中去 以及把一個 list中的單個元素搬移到另一箇中去 每種形式都給出了一個指出插入一個或一組元素的位置的iterator 例如 給出下列兩個 list:
int array[ 10 ] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 };
list< int > ilist1( array, array + 10 );
list< int > ilist2( array, array+2 ); // 包含 0, 1
下面使用 splice()把 ilist1 的第一個元素移到 ilist2 中 現在 ilist2 包含元素 0 1 0 而ilist1 不再包含 0:
// ilist2.end() 指示要接合元素的位置
// 被接合的元素在該位置之前
// ilist1 指示從哪個 list 中移動元素
// ilist1.begin() 指示要被移動的元素
ilist2.splice( ilist2.end(), ilist1, ilist1.begin() )
在 splice()的下一個用法中 傳遞了兩個 iterator 指示要移動元素的子範圍:
list< int >::iterator first, last;
first = ilist1.find( 2 );
last = ilist1.find( 13 );
ilist2.splice( ilist2.begin(), ilist1, first, last );
在這種情況下 元素 2 3 5 和 8 被從 ilist1 移到 ilist2 的前部 現在 ilist1 含有五個元素 1 1 13 21 和 34 爲了把剩下這些元素移到 ilist2 中 可以使用 splice()操符的最後一種形式
list< int >::iterator pos = ilist2.find( 5 );
ilist2.splice( pos, ilist1 );
現在 ilist1 是空的 剩下的五個元素被移到 ilist2 中 放在值爲 5 的元素之前的位置