STLalgorithm算法merge(34)


STLalgorithm算法merge(34)

merge原型:

std::merge

default (1)
template <class InputIterator1, class InputIterator2, class OutputIterator>
  OutputIterator merge (InputIterator1 first1, InputIterator1 last1,
                        InputIterator2 first2, InputIterator2 last2,
                        OutputIterator result);
custom (2)
template <class InputIterator1, class InputIterator2,
          class OutputIterator, class Compare>
  OutputIterator merge (InputIterator1 first1, InputIterator1 last1,
                        InputIterator2 first2, InputIterator2 last2,
                        OutputIterator result, Compare comp);

该函数是将两个范围内的元素合并到一个新的位置(result)中,并且保证有序。

使用operator<进行比较。

在使用该函数之前,应该保证两个子范围内的元素都是有序的

result的大小为两个子范围元素个数之和。应保证result的大小足以容纳所有的元素。

返回值为result的最后一个被覆盖元素的下一个元素的迭代器

其行为类似于:

template <class InputIterator1, class InputIterator2, class OutputIterator>
  OutputIterator merge (InputIterator1 first1, InputIterator1 last1,
                        InputIterator2 first2, InputIterator2 last2,
                        OutputIterator result)
{
  while (true) {
    if (first1==last1) return std::copy(first2,last2,result);
    if (first2==last2) return std::copy(first1,last1,result);
    *result++ = (*first2<*first1)? *first2++ : *first1++;
  }
}

一个简单的例子:(result本身为空)

#include <iostream>
#include <vector>
#include <array>
#include <algorithm>
using namespace std;
void merge2(){
    vector<int> vi{1,3,5,7,9};
    array<double,4> ad{2.0,4.0,6.0,8.0};
    cout<<"vi=";
    for(int i:vi)
        cout<<i<<" ";
    cout<<endl;
    cout<<"ad=";
    for(double i:ad)
        cout<<i<<" ";
    cout<<endl;

    vector<double> vr(vi.size()+4);
    auto it=merge(vi.begin(),vi.end(),ad.begin(),ad.end(),vr.begin());
     cout<<"vr=merge(vi.begin(),vi.end(),ad.begin(),ad.end(),vr.begin())\nvr=";
    for(double i:vr)
        cout<<i<<" ";
    cout<<endl;

    if(it==vr.end())
        cout<<"merge(vi.begin(),vi.end(),ad.begin(),ad.end(),vr)=vr.end()!"<<endl;

}

运行截图:

result本身不为空的时候:

#include <iostream>
#include <vector>
#include <array>
#include <algorithm>
using namespace std;
void merge3(){
    vector<int> vi{1,3,5,7,9};
    array<double,4> ad{2.0,4.0,6.0,8.0};
    cout<<"vi=";
    for(int i:vi)
        cout<<i<<" ";
    cout<<endl;
    cout<<"ad=";
    for(double i:ad)
        cout<<i<<" ";
    cout<<endl;

    vector<double> vr{11,22,33,44,55,66,77,88,99,111,222,333};
    for(double i:vr)
        cout<<i<<" ";
    cout<<endl;
    auto it=merge(vi.begin(),vi.end(),ad.begin(),ad.end(),vr.begin());
     cout<<"after merge(vi.begin(),vi.end(),ad.begin(),ad.end(),vr.begin())\nvr=";
    for(double i:vr)
        cout<<i<<" ";
    cout<<endl;

    if(it==vr.end())
        cout<<"merge(vi.begin(),vi.end(),ad.begin(),ad.end(),vr)=vr.end()!"<<endl;
    else
        cout<<"it="<<*it<<endl;


}

运行截图:


可以看到,这种情况下返回的迭代器指向111,也就是最后一个被覆盖的元素的下一个!


——————————————————————————————————————————————————————————————————

//写的错误或者不好的地方请多多指导,可以在下面留言或者点击左上方邮件地址给我发邮件,指出我的错误以及不足,以便我修改,更好的分享给大家,谢谢。

转载请注明出处:http://blog.csdn.net/qq844352155

author:天下无双

Email:coderguang@gmail.com

2014-9-17

于GDUT

——————————————————————————————————————————————————————————————————



发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注