当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ Algorithm inplace_merge()用法及代码示例


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

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

用法

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

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

参数

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

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

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

comp: 一个用户定义的二元谓词函数,它接受两个参数,如果两个参数是有序的,则返回真,否则返回假。它遵循严格的弱排序来对元素进行排序。

返回值

复杂度

如果有足够的额外内存可用,那么复杂性在 first 和 last 之间的距离上是线性的:执行 N-1 次比较并且最多移动两倍的元素。

否则,复杂性是线性的:执行最多 N*log(N) 个元素比较,其中 N = last -first 并且最多执行这么多元素交换。

数据竞争

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

异常

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

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

例子1

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

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

using namespace std;

int main () {
  int first[] = {5,10,15,20,25};
  int second[] = {50,40,30,20,10};
  vector<int> v(10);
  vector<int>::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

让我们看另一个简单的例子,演示使用 operator< 来使用 inplace_merge():

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main(void) {
   vector<int> 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 <iostream>
#include <algorithm>
#include <vector>

using namespace std;

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

int main(void) {
   vector<int> 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 <vector>
#include <iostream>
#include <algorithm>
 
using namespace std; 
 
template<class Iter>
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<int> 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





相关用法


注:本文由纯净天空筛选整理自 C++ Algorithm inplace_merge()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。