Операция 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()
имеет три формы: перемещение одного элемента, всех элементов или диапазона из одного списка в другой. В каждом случае передается итератор, указывающий на позицию вставки, а перемещаемые элементы располагаются непосредственно перед ней. Если даны два списка:
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 указывает на список, из которого перемещается элемент // ilist1.begin() указывает на сам перемещаемый элемент |
ilis2.splice( ilist2.end(), ilist1, ilist1.begin() );
В следующем примере применения splice() передаются два итератора, ограничивающие диапазон перемещаемых элементов:
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.