list::splice()函数详解
list::splice实现list拼接的功能。将源list的内容部分或全部元素删除,拼插入到目的list。
函数有以下三种声明:
void splice ( iterator position, list<T,Allocator>& x );
void splice ( iterator position, list<T,Allocator>& x, iterator i );
void splice ( iterator position, list<T,Allocator>& x, iterator first, iterator last );
函数说明:在list间移动元素:
将x的元素移动到目的list的指定位置,高效的将他们插入到目的list并从x中删除。
目的list的大小会增加,增加的大小为插入元素的大小。x的大小相应的会减少同样的大小。
前两个函数不会涉及到元素的创建或销毁。第三个函数会。
指向被删除元素的迭代器会失效。
参数:
position:
目的list的位置,用来标明 插入位置;
x:
源list、
first,last
x里需要被移动的元素的迭代器,区间为[first, last).
例子:
// splicing lists #include <iostream> #include <list> #include <string> #include <algorithm> using namespace std;
int main () { list<int> mylist1, mylist2; list<int>::iterator it; // set some initial values: for (int i=1; i<=4; i++) mylist1.push_back(i); // mylist1: 1 2 3 4 for (int i=1; i<=3; i++) mylist2.push_back(i*10); // mylist2: 10 20 30 it = mylist1.begin(); ++it; // points to 2 mylist1.splice (it, mylist2); // mylist1: 1 10 20 30 2 3 4 // mylist2 (empty) // "it" still points to 2 (the 5th element) mylist2.splice (mylist2.begin(),mylist1, it); // mylist1: 1 10 20 30 3 4 // mylist2: 2 // "it" is now invalid. it = mylist1.begin(); advance(it,3); // "it" points now to 30 mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end()); // mylist1: 30 3 4 1 10 20 cout << "mylist1 contains:"; for (it=mylist1.begin(); it!=mylist1.end(); it++) cout << " " << *it; cout << "/nmylist2 contains:"; for (it=mylist2.begin(); it!=mylist2.end(); it++) cout << " " << *it; cout << endl;
list<string> dictionary, bword; dictionary.push_back("any"); dictionary.push_back("angle"); dictionary.push_back("ajust"); dictionary.push_back("common"); dictionary.push_back("cannon"); dictionary.push_back("company"); bword.push_back("blue"); bword.push_back("banana"); bword.push_back("break"); list<string>::iterator its = dictionary.begin(); for (int i = 0; i < 3; i++) its++; dictionary.splice(its, bword); copy(bword.begin(), bword.end(), ostream_iterator<string>(cout, "/n")); return 0; }