📜  在C++ STL中使用std :: merge()快速合并两个排序的数组(1)

📅  最后修改于: 2023-12-03 14:51:14.737000             🧑  作者: Mango

在C++ STL中使用std::merge()快速合并两个排序的数组

在C++ STL中,std::merge()是一个非常便捷的合并两个排序数组的函数。它可以将两个排序的序列合并成一个排序的序列,适用于合并两个已排序的数组或容器。

语法
template<class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
                     InputIterator2 first2, InputIterator2 last2,
                     OutputIterator result);

参数解释:

  • first1:第一个已排序序列的起始位置。
  • last1:第一个已排序序列的结束位置。
  • first2:第二个已排序序列的起始位置。
  • last2:第二个已排序序列的结束位置。
  • result:存储合并后序列的目标位置。

返回值:

  • 指向合并后序列的最后一个元素的后一个位置的迭代器。
示例
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec1 = {1, 3, 5};
    vector<int> vec2 = {2, 4, 6};
    vector<int> result(6);

    merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin());

    for (auto i : result)
    {
        cout << i << " ";
    }

    return 0;
}

输出结果:

1 2 3 4 5 6
注意事项
  • 合并后序列的长度必须足够存储两个已排序序列的所有元素。
  • 如果需要在其他容器中存储合并后序列,可以使用std::inserter()函数来插入元素。例如:
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec1 = {1, 3, 5};
    vector<int> vec2 = {2, 4, 6};
    vector<int> result;

    merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), back_inserter(result));

    for (auto i : result)
    {
        cout << i << " ";
    }

    return 0;
}

输出结果:

1 2 3 4 5 6
  • std::merge()函数不会自动去重,如果需要去重需使用std::unique()函数。例如:
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec1 = {1, 3, 5, 5};
    vector<int> vec2 = {2, 4, 6, 6};
    vector<int> result(8);

    auto end = merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin());
    end = unique(result.begin(), end);

    for (auto iter = result.begin(); iter != end; ++iter)
    {
        cout << *iter << " ";
    }

    return 0;
}

输出结果:

1 2 3 4 5 6