merge函数

merge函数

  • merge函数的作用是:将两个有序的序列合并为一个有序的序列。

  • 合并操作会合并两个有相同顺序的序列中的元素,可以是两个升序序列,也可以是两个降序序列。结果会产生一个包含来自这两个输入序列的元素副本的序列,并且排序方式和原始序列相同

  • merge() 算法会合并两个序列并将结果保存到第三个序列中,它使用 < 运算符来比较元素。图 1 表明合并操作被运用到 these 和 those 容器的内容上,结果序列保存在 both 容器中。

  • merge() 算法需要 5 个参数。其中前两个指定第一个输入序列的迭代器,在这个示例中是 these,后面两个迭代器指定第二个输入序列,在这个示例中是 those,最后一个参数是一个指定合并元素存放位置的迭代器,即 both 容器。用来指定输入序列的迭代器只需要是最低层次的迭代器,用来保存合并结果的迭代器需要是一个输出迭代器。

  • 当需要使用不同于 < 运算符的其他比较运算时,可以提供一个函数对象用来作为第 6 个参数。
  • merge() 算法并没有关于被合并序列容器的信息,所以它们不能创建元素,只能用提供的作为第 5 个参数的迭代器来保存元素。因而在这个示例中,

    目的序列中的元素必须是已经存在的。

    在图 1 中,通过以两个输入容器元素个数之和为指定的元素个数创建一个 both 容器来保证此要求。创建的结果序列可以放在任何位置,甚至可以放在一个源序列容器中,但源序列和目的序列不能重叠;如果它们重叠了,结果是未定义的,但可以肯定的是效果肯定不好。当然,可以用一个插入迭代器来指定目的位置,元素会被自动创建。

返回值

指向最后复制元素后一元素的迭代器。
merge() 算法返回的迭代器指向合并序列末尾的后一个位置,所以可以通过这个函数调用使用的第 5 个参数加上这个函数返回的迭代器来确定合并序列的范围。

源码

1.

1
2
3
4
5
6


template< class InputIt1, class InputIt2, class OutputIt, class Compare>
constexpr OutputIt merge( InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2,
OutputIt d_first, Compare comp );

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22



template<class InputIt1, class InputIt2, class OutputIt>
OutputIt merge(InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2,
OutputIt d_first)
{
for (; first1 != last1; ++d_first) {
if (first2 == last2) {
return std::copy(first1, last1, d_first);
}
if (*first2 < *first1) {
*d_first = *first2;
++first2;
} else {
*d_first = *first1;
++first1;
}
}
return std::copy(first2, last2, d_first);
}

2.

1
2
3
4
5
6
7
8




template< class InputIt1, class InputIt2, class OutputIt >
constexpr OutputIt merge( InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2,
OutputIt d_first );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23



template<class InputIt1, class InputIt2,
class OutputIt, class Compare>
OutputIt merge(InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2,
OutputIt d_first, Compare comp)
{
for (; first1 != last1; ++d_first) {
if (first2 == last2) {
return std::copy(first1, last1, d_first);
}
if (comp(*first2, *first1)) {
*d_first = *first2;
++first2;
} else {
*d_first = *first1;
++first1;
}
}
return std::copy(first2, last2, d_first);
}
  • 归并二个已排序范围 [first1, last1) 和 [first2, last2) 到始于 d_first 的一个已排序范围中。

    • 用 operator< 比较元素。
    • 用给定的二元比较函数 comp 比较元素。
    • first1, last1 要归并的元素的第一范围
    • first2, last2 要归并到元素的第二范围
    • d_first 目标范围的起始
  • 类型要求
    -InputIt1, InputIt2 必须满足 LegacyInputIterator 的要求。
    -ForwardIt1, ForwardIt2, ForwardIt3 必须满足 LegacyForwardIterator 的要求。
    -OutputIt 必须满足 LegacyOutputIterator 的要求。

vector合并

  • merge第五个参数即用来存储的第三个vector大小必须预先确定,虽然用vec.begin();可以指向首地址,但是无存储空间
  • 自己代码
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
27
28





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

using namespace std;

int main(){
vector<int> a, b;
vector<int> c(100);
int n, m, i = 0, j[100];
cin >> n;
for(int i = 0; i < n; i++)
cin >> j[i], a.push_back(j[i]);
i = 0;
cin >> m;
for(int i = 0; i < m; i++)
cin >> j[i], b.push_back(j[i]);
merge(a.begin(), a.end(), b.begin(), b.end(), c.begin());

for(i = 0; i < a.size()+b.size(); i++)
cout << c[i] << " ";
return 0;
}
------ The Happy Ending ------