function template
<algorithm>

std::inplace_merge

預設 (1)
template <class BidirectionalIterator>  void inplace_merge (BidirectionalIterator first, BidirectionalIterator middle,                      BidirectionalIterator last);
自定義 (2)
template <class BidirectionalIterator, class Compare>  void inplace_merge (BidirectionalIterator first, BidirectionalIterator middle,                      BidirectionalIterator last, Compare comp);
合併兩個相鄰的已排序範圍
合併兩個相鄰的已排序範圍:[first,middle)[middle,last),將結果放入合併後的已排序範圍 [first,last)

元素使用第一個版本的 operator< 以及第二個版本的 comp 進行比較。兩個範圍中的元素都應已根據此相同標準(operator<comp)排序。結果範圍也根據此標準排序。

該函式保留具有等價值的元素的相對順序,其中第一個範圍中的元素位於第二個範圍中等價元素的前面。

引數

first
雙向迭代器,指向第一個要合併的已排序序列的初始位置。這也是儲存合併後結果範圍的初始位置。
middle
雙向迭代器,指向第二個已排序序列的初始位置,由於兩個序列都必須是相鄰的,因此這與第一個序列的結束之後位置匹配。
last
雙向迭代器,指向第二個已排序序列的結束之後位置。這也是儲存合併後結果範圍的結束之後位置。
comp
二元函式,接受迭代器指向的型別的兩個引數,並返回一個可轉換為 bool 的值。返回值指示第一個引數在它所定義的特定嚴格弱序中是否被認為排在第二個引數之前。
該函式不得修改其任何引數。
這可以是函式指標或函式物件。

BidirectionalIterator 應指向一個型別,該型別已正確定義 swap 並且是可移動構造可移動賦值的。

返回值



示例

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
// inplace_merge example
#include <iostream>     // std::cout
#include <algorithm>    // std::inplace_merge, std::sort, std::copy
#include <vector>       // std::vector

int main () {
  int first[] = {5,10,15,20,25};
  int second[] = {50,40,30,20,10};
  std::vector<int> v(10);
  std::vector<int>::iterator it;

  std::sort (first,first+5);
  std::sort (second,second+5);

  it=std::copy (first, first+5, v.begin());
     std::copy (second,second+5,it);

  std::inplace_merge (v.begin(),v.begin()+5,v.end());

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

  return 0;
}

輸出
The resulting vector contains: 5 10 10 15 20 20 25 30 40 50


複雜度

如果提供足夠的額外記憶體,則線性複雜度,與 firstlast 之間的 距離成正比:進行 N-1 次比較和最多兩倍的元素移動。
否則,為對數線性複雜度:進行最多 N*log(N) 次元素比較(其中 N 是上述距離),以及最多此數量的元素交換。

資料競爭

範圍[first,last)內的物件將被修改。

異常

如果任何元素比較、元素交換(或移動)或迭代器操作丟擲異常,則會丟擲異常。
請注意,無效引數會導致未定義行為

另見