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.
1 |
|
1 |
|
归并二个已排序范围 [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 |
|