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)内的对象将被修改。

异常

如果任何元素比较、元素交换(或移动)或迭代器操作抛出异常,则会抛出异常。
请注意,无效参数会导致未定义行为

另见