📜  C++ STL-list.splice()函数(1)

📅  最后修改于: 2023-12-03 14:59:45.756000             🧑  作者: Mango

C++ STL-list.splice()函数

简介

std::list::splice()是C++ STL中list容器提供的成员函数之一,它允许将一段元素(节点)从当前列表中移除,并将它们插入到另一个列表的给定位置。这个函数是通过双向链表的指针操作实现的。

函数原型
void splice(const_iterator pos, list& other);
void splice(const_iterator pos, list& other, const_iterator it);
void splice(const_iterator pos, list& other, const_iterator first, const_iterator last);
  • pos - 表示将被插入的位置
  • other - 另一个列表
  • first, last - 要在源列表中删除的元素的指示
  • it - 要在源列表中删除的一个元素的指示
功能

splice()函数有三种调用方式:

第一种调用方式将other所有元素插入到当前列表中的pos为空节数或首位元素前面:

some_list.splice(some_list.begin(), other);

第二种调用方式将other中一个元素(通过it参数指示)插入到pos前面:

some_list.splice(pos, other, it);

第三种调用方式将从firstlast所有元素删除,并将它们插入到pos前面:

some_list.splice(pos, other, first, last);
代码示例
#include <iostream>
#include <list>

int main () {
  std::list<int> mylist1, mylist2;
  std::list<int>::iterator it;

  // list initialization
  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;                        

  // splice first example
  mylist1.splice (it, mylist2); // mylist1: 1 10 20 30 2 3 4,mylist2: empty

  // splice second example
  mylist2.splice (mylist2.begin(),mylist1, it); 

  //splice third example
  it = mylist1.begin();
  std::advance(it,3);          
  mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());

  // print out 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;
}

在上面的示例中,我们首先创建两个list对象mylist1mylist2,并使用push_back()函数将一些数字添加到每个对象中。

接下来我们使用advance()函数将迭代器it指向mylist1中的第二个元素。然后使用第一种调用方式,将mylist2中的所有元素插入到mylist1中的it之前(也就是在2的前面)。

接下来我们使用第二种调用方式,将mylist1中的it之后的元素(也就是34)中的第一个元素插入到mylist2中。我们使用begin()函数获取mylist2的迭代器,使得新元素被插入到mylist2的最前面。

最后,我们使用第三种调用方式,将mylist1中从it开始到end()的所有元素从原位置移动到mylist1的开始。

最后,我们通过循环遍历mylist1mylist2,输出它们中所有的元素,以验证这些列表在各种调用之后所包含的内容。在执行完上述代码后,您将会在终端看到下列输出:

mylist1 contains: 3 4 1 10 20 30 2
mylist2 contains: 4