📜  C++ STL-algorithm.inplace_merge()函数

📅  最后修改于: 2020-10-17 06:26:40             🧑  作者: Mango

C++ STL algorithminplace_merge()

C++ STL algorithm.inplace_merge()函数用于将两个连续的排序范围[first,last]和[middle,last)合并为一个排序范围[first,last]。

对于第一个版本,使用运算符<或第二个版本使用给定的二进制比较函数comp来比较元素。

句法

default (1)    template 
                       void inplace_merge (BidirectionalIterator first, BidirectionalIterator middle,
                                                        BidirectionalIterator last);

custom (2)   template 
                     void inplace_merge (BidirectionalIterator first, BidirectionalIterator middle,
                                                     BidirectionalIterator last, Compare comp);

参数

first:双向迭代器,该迭代器指向要合并并排序为单个范围的两个连续排序范围中的第一个范围中的第一个元素。

last:一个双向迭代器,它指向要合并并排序到单个范围中的两个连续排序范围中的第二个范围中的最后一个元素。

middle:双向迭代器,它指向要合并并排序到单个范围内的两个连续排序范围中的第二个范围中的第一个元素的位置。

comp:用户定义的二进制谓词函数,该函数接受两个参数,如果两个参数的顺序为false,则返回true。它遵循严格的弱排序来对元素进行排序。

返回值

没有

复杂度

如果有足够的额外内存可用,那么复杂度在第一个和最后一个之间是线性的:执行N-1个比较,最多移动两倍于许多元素。

否则,复杂度是线性的:执行最多N * log(N)个元素比较,其中N =倒数第一个,并且最多交换许多元素。

数据竞争

[first,last)范围内的对象被修改。

异常处理

如果元素比较,元素交换(或移动)或迭代器上的任何操作抛出异常,则此函数将引发异常。

注意:无效的参数会导致未定义的行为。

例子1

让我们看一个简单的示例来演示inplace_merge()的用法:

#include     
#include    
#include        
using namespace std;
 
void printVector(vector& v)
{
    for (vector::iterator it = v.begin(); it != v.end(); ++it)
        cout << ' ' << *it;
    cout << '\n';
}
 
int main () {
    vector v1 = {5,10,15,20,25}, v2 = {50,40,30,20,10}, v3(10);
    vector::iterator it;
 
    sort(v1.begin(), v1.end());
    sort(v2.begin(), v2.end());
    it = copy(v1.begin(), v1.end(), v3.begin());
    copy(v2.begin(), v2.end(), it);
    inplace_merge(v3.begin(), it, v3.end());
 
    cout << "Vector v1 : ";
    printVector(v1);
    cout << "Vector v2 : ";
    printVector(v2);
    cout << "Vector v3 : ";
    printVector(v3);
}

输出:

Vector v1 :  5 10 15 20 25
Vector v2 :  10 20 30 40 50
Vector v3 :  5 10 10 15 20 20 25 30 40 50

例子2

让我们看另一个简单的例子:

#include      // std::cout
#include     // std::inplace_merge, std::sort, std::copy
#include        // std::vector

using namespace std;

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

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

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

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

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

  return 0;
}

输出:

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

例子3

让我们来看另一个简单的示例,该示例使用运算符<演示inplace_merge()的用法:

#include 
#include 
#include 

using namespace std;

int main(void) {
   vector v = {1, 3, 2, 4, 5};

   inplace_merge(v.begin(), v.begin() + 2, v.end());

   for (auto it = v.begin(); it != v.end(); ++it)
      cout << *it << endl;

   return 0;
}

输出:

1
2
3
4
5

例子4

让我们看一个简单的示例,通过比较函数演示inplace_merge()的用法:

#include 
#include 
#include 

using namespace std;

bool descending_sort(int a, int b) {
   return (a > b);
}

int main(void) {
   vector v = {3, 1, 5, 4, 2};

   inplace_merge(v.begin(), v.begin() + 2, v.end(), descending_sort);

   for (auto it = v.begin(); it != v.end(); ++it)
      cout << *it << endl;

   return 0;
}

输出:

5
4
3
2
1

例子5

让我们看另一个简单的例子:

#include 
#include 
#include 
 
using namespace std; 
 
template
void merge_sort(Iter first, Iter last)
{
    if (last - first > 1) {
        Iter middle = first + (last - first) / 2;
        merge_sort(first, middle);
        merge_sort(middle, last);
        inplace_merge(first, middle, last);
    }
}
 
int main()
{
    vector v{10, 2, -9, 0, 9, 7, 1, 3, 4};
    merge_sort(v.begin(), v.end());
    for(auto n : v) {
        cout << n << ' ';
    }
    cout << '\n';
    
    return 0;
}

输出:

-9 0 1 2 3 4 7 9 10