stl算法之merge

有些场景中,我们需要将 2 个有序序列合并为 1 个有序序列,这时就可以借助 merge() 或者 inplace_merge() 函数实现。

值得一提的是,merge() 和 inplace_merge() 函数都定义在头文件中,因此在使用它们之前,程序中必须提前引入该头文件:

#include <algorithm>

merge() 函数用于将 2 个有序序列合并为 1 个有序序列,前提是这 2 个有序序列的排序规则相同(要么都是升序,要么都是降序)。并且最终借助该函数获得的新有序序列,其排序规则也和这 2 个有序序列相同。

举个例子,假设有 2 个序列,分别为5,10,15,20,25和7,14,21,28,35,42,显然它们不仅有序,而且都是升序序列。因此借助 merge() 函数,我们就可以轻松获得如下这个有序序列:
5 7 10 15 17 20 25 27 37 47 57

可以看到,该序列不仅包含以上 2 个序列中所有的元素,并且其本身也是一个升序序列。

//以默认的升序排序作为排序规则
OutputIterator merge (InputIterator1 first1, InputIterator1 last1,
                      InputIterator2 first2, InputIterator2 last2,
                      OutputIterator result);
//以自定义的 comp 规则作为排序规则
OutputIterator merge (InputIterator1 first1, InputIterator1 last1,
                      InputIterator2 first2, InputIterator2 last2,
                      OutputIterator result, Compare comp);

可以看到,first1、last1、first2 以及 last2 都为输入迭代器,[first1, last1) 和 [first2, last2) 各用来指定一个有序序列;result 为输出迭代器,用于为最终生成的新有序序列指定存储位置;comp 用于自定义排序规则。同时,该函数会返回一个输出迭代器,其指向的是新有序序列中最后一个元素之后的位置。
注意,当采用第一种语法格式时,[first1, last1) 和 [first2, last2) 指定区域内的元素必须支持 < 小于运算符;同样当采用第二种语法格式时,[first1, last1) 和 [first2, last2) 指定区域内的元素必须支持 comp 排序规则内的比较运算符。

void merge_array(int a1[], int n1, int a2[], int n2, int a3[])
{
	int i = 0;
	int j = 0;
	int t = 0;
	while (i<n1 && j<n2)
	{
		if (a1[i]<a2[j])
		{
			a3[t++] = a1[i];
			i++;
		}
		else
		{
			a3[t++] = a2[j];
			j++;
		}
	}


	while (i<n1)
	{
		a3[t++] = a1[i++];
	}

	while (j < n2)
	{
		a3[t++] = a2[j++];
	}
	
}
void main()
{

	int m_vc1[] = { 1, 3, 5, 7, 9 };
	int m_vc2[] = { 2, 4, 6, 8, 10,12,14 };
	int m_vc3[12];	
	//std::merge(m_vc1.begin(), m_vc1.end(), m_vc2.begin(), m_vc2.end(), m_vc3.begin());
	//自定义方法:
	cout << "自定义方法:\n";
	merge_array(m_vc1,5, m_vc2, 7,m_vc3);

	for (auto node : m_vc3)
	{
		cout << node << " ";
	}
	cout << endl;
	int m_vc4[12];
	cout << "标准库函数:\n";
	std::merge(m_vc1, m_vc1 + 5, m_vc2, m_vc2 + 7, m_vc4);

	for (auto node : m_vc4)
	{
		cout << node << " ";
	}

	cout << endl;


	system("pause");
}

结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发如雪-ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值