C++ 算法 中的 inplace_merge函数

首页 / C++入门教程 / C++ 算法 中的 inplace_merge函数

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

inplace_merge - 语法

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);

inplace_merge - 参数

first:一个双向迭代器,该迭代器指向两个要合并的连续排序参数中的第一个参数中的第一个元素,并将其合并到单个参数中。

last:一个双向迭代器,它指向两个要合并的连续参数中的第二个参数中最后一个过去的元素,以将其合并并分为一个参数。

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

comp :用户定义的二进制谓词函数,该函数接受两个参数,如果两个参数的顺序为false,则返回true。

inplace_merge - 返回值

没有

inplace_merge - 例子1

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

链接:https://www.learnfk.comhttps://www.learnfk.com/c++/cpp-algorithm-inplace-merge-function.html

来源:LearnFk无涯教程网

#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

inplace_merge - 例子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

inplace_merge - 例子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

inplace_merge - 例子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

inplace_merge - 例子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

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

从0开始学架构 -〔李运华〕

网络编程实战 -〔盛延敏〕

研发效率破局之道 -〔葛俊〕

高并发系统设计40问 -〔唐扬〕

说透数字化转型 -〔付晓岩〕

深入C语言和程序运行原理 -〔于航〕

自动化测试高手课 -〔柳胜〕

徐昊 · TDD项目实战70讲 -〔徐昊〕

超级访谈:对话玉伯 -〔玉伯〕

好记忆不如烂笔头。留下您的足迹吧 :)