public member function
<list>

std::list::splice

entire list (1)
void splice (iterator position, list& x);
single element (2)
void splice (iterator position, list& x, iterator i);
element range (3)
void splice (iterator position, list& x, iterator first, iterator last);
entire list (1)
void splice (const_iterator position, list& x);void splice (const_iterator position, list&& x);
single element (2)
void splice (const_iterator position, list& x, const_iterator i);void splice (const_iterator position, list&& x, const_iterator i);
element range (3)
void splice (const_iterator position, list& x,             const_iterator first, const_iterator last);void splice (const_iterator position, list&& x,             const_iterator first, const_iterator last);
Transfer elements from list to list
x 中的元素转移到容器中,并将它们插入到 position

这有效地将这些元素插入到容器中,并从 x 中移除它们,从而改变两个容器的大小。此操作不涉及任何元素的构造或析构。它们会被转移,无论 x 是左值还是右值,也无论value_type是否支持移动构造。

第一个版本 (1)x 的所有元素转移到容器中。
第二个版本 (2) 仅将 i 指向的元素从 x 转移到容器中。
第三个版本 (3) 转移范围[first,last)x 到容器中。

参数

position
x 中的元素将被插入到容器内的位置。
成员类型iteratorconst_iterator双向迭代器 类型,指向元素。
x
一个 list 对象,具有相同的类型(即相同的模板参数,TAlloc).
此参数可以是*this如果 position 指向一个实际上未被拼接的元素(对于第一个版本,情况永远不会如此,但对于其他版本则可能)。
i
指向 x 中某个元素的迭代器。仅转移此单个元素。
iterator是成员类型,定义为 双向迭代器 类型。
成员类型iteratorconst_iterator双向迭代器 类型,指向元素。
first,last
指定 x 中元素范围的迭代器。将范围内的元素转移[first,last)position
请注意,范围包括 first 和 last 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
成员类型iteratorconst_iterator双向迭代器 类型,指向元素。

返回值



示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 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)
                                          
  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

  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;
}
输出
mylist1 contains: 30 3 4 1 10 20
mylist2 contains: 2


复杂度

对于 (1)(2) 是常数。
对于 (3),最多为线性(相对于转移的元素数量)。

迭代器有效性

调用前,容器的迭代器、指针和引用没有变化。
先前指向被转移元素的迭代器、指针和引用将继续指向这些相同的元素,但迭代器现在将指向已转移到容器中的元素。

数据竞争

容器和 x 都被修改。
并发访问或修改它们的元素是安全的,但迭代 x 或包含 position 的范围则不安全。

异常安全

如果两个容器中的 分配器 不相等,如果指定的任何迭代器或范围无效,或者如果 x*this(1) 中,或者如果 position 在范围[first,last)(3) 中,将导致 未定义行为
否则,该函数永远不会抛出异常(无抛出保证)。

另见