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
——————————————————————————————————————————————————————————————————