list 的splice函数主要是用来合并两个list。
splice是list中特有的拼接方法。splice实现了不需要拷贝的list合并,即可以在常数时间内从list的一个区域拼接到另一个list的一个区域。也就是说splice是一个常数时间的函数(但是也会产生其他形如list的size()问题,导致size()处理时间为O(n)不为常数,见http://blog.csdn.net/russell_tao/article/details/8572000)。

// splicing lists
#include <iostream>
#include <list>

int main ()
{
  std::list<int> mylist1, mylist2;
  std::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)
//此处的it由于是指向的mylist1,splice后,此迭代器依然存在于
//mylist1中,故而不失效,而后面的splice,由于it指向的地址被插入到
//mylist2中,而使迭代器it失效

  mylist2.splice (mylist2.begin(),mylist1, it);
                                // mylist1: 1 10 20 30 3 4
                                // mylist2: 2
                                // "it" is now invalid.
  it = mylist1.begin();
  std::advance(it,3);           // "it" points now to 30

  mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
                                // mylist1: 30 3 4 1 10 20
    //注意此处mylist前后交换了,这可以用作list形如循环移位的操作
  std::cout << "mylist1 contains:";
  for (it=mylist1.begin(); it!=mylist1.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  std::cout << "mylist2 contains:";
  for (it=mylist2.begin(); it!=mylist2.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐