public member function
<list>

std::list::merge

(1)
  void merge (list& x);
(2)
template <class Compare>  void merge (list& x, Compare comp);
(1)
  void merge (list& x);  void merge (list&& x);
(2)
template <class Compare>  void merge (list& x, Compare comp);template <class Compare>  void merge (list&& x, Compare comp);
合併已排序的列表
x 中的所有元素按其各自的有序位置合併到列表中(兩個容器都必須已排序)。

這會有效地移除 x 中的所有元素(使其變為empty),並將它們插入到容器的有序位置(該容器的size會因傳輸的元素數量而增加)。該操作無需構建或銷燬任何元素:它們被傳輸,無論 x 是左值還是右值,也無論value_type是否支援移動構造。

具有兩個引數(2)的模板版本具有相同的行為,但它們接受一個特定的謂詞(comp)來執行元素之間的比較操作。此比較應產生元素的“嚴格弱序”(strict weak ordering)(即,一致的傳遞比較,不考慮其自反性)。

此函式要求在呼叫前list容器的元素已根據值(或comp)排序。對於無序列表的替代方法,請參見list::splice

在假定存在這種排序的情況下,x 中的每個元素都會根據由operator<comp 定義的“嚴格弱序”插入到與其值對應的位置。等效元素的結果順序是穩定的(即,等效元素保留它們在呼叫前的相對順序,並且現有元素優先於從 x 插入的等效元素)。

如果(&x == this).

引數

x
一個 list 物件,具有相同的型別(即相同的模板引數,TAlloc).
請注意,無論傳遞的是左值還是右值引用,此函式都會修改 x
comp
二元謂詞,它接受兩個與list中包含的元素型別相同的引數,並返回true如果第一個引數被認為在其定義的“嚴格弱序”中排在第二個引數之前,則返回false否則為 false。
這應該是一個函式指標或函式物件。

返回值



示例

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
// list::merge
#include <iostream>
#include <list>

// compare only integral part:
bool mycomparison (double first, double second)
{ return ( int(first)<int(second) ); }

int main ()
{
  std::list<double> first, second;

  first.push_back (3.1);
  first.push_back (2.2);
  first.push_back (2.9);

  second.push_back (3.7);
  second.push_back (7.1);
  second.push_back (1.4);

  first.sort();
  second.sort();

  first.merge(second);

  // (second is now empty)

  second.push_back (2.1);

  first.merge(second,mycomparison);

  std::cout << "first contains:";
  for (std::list<double>::iterator it=first.begin(); it!=first.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

輸出
first contains: 1.4 2.2 2.9 2.1 3.1 3.7 7.1

注意在第二次合併中,函式mycomparison(僅比較整數部分)沒有考慮到2.1小於2.22.9,因此它被插入到它們之後,在3.1.


複雜度

最多是兩個容器大小之和減一(比較次數)的線性複雜度。

迭代器有效性

呼叫前,容器的迭代器、指標和引用沒有變化。
先前指向被轉移元素的迭代器、指標和引用將繼續指向這些相同的元素,但迭代器現在將指向已轉移到容器中的元素。

資料競爭

容器和 x 都被修改。
併發訪問或修改它們的元素是安全的,儘管迭代任一容器都是不安全的。

異常安全

如果兩個容器的allocator不相等,如果 comp 未定義“嚴格弱序”,或者容器元素未根據它排序,則會導致“未定義行為”。
否則,如果比較操作丟擲異常,容器將保持有效狀態(基本保證)。
否則,如果丟擲異常,容器將不發生任何更改(強保證)。

另見