STL算法(Algorithms):合并(Merge)

本文介绍了几种常用的排序算法和集合操作算法,包括merge、inplace_merge、includes等,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、merge:将两个序列合并成一个新的序列,并对新的序列排序
原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,OutputIterator result );
template <class InputIterator1, class InputIterator2,class OutputIterator, class Compare>
OutputIterator merge ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,OutputIterator result, Compare comp );
示例:

//mergealgorithmexample
#include<iostream>
#include
<algorithm>
#include
<vector>
usingnamespacestd;

intmain(){
intfirst[]={5,10,15,20,25};
intsecond[]={50,40,30,20,10};
vector
<int>v(10);
vector
<int>::iteratorit;

sort(first,first
+5);
sort(second,second
+5);
merge(first,first
+5,second,second+5,v.begin());

cout
<<"Theresultingvectorcontains:";
for(it=v.begin();it!=v.end();++it)
cout
<<""<<*it;

cout
<<endl;

return0;
}



2、inplace_merge:将两个序列合并成一个新的序列,并对新的序列进行归并排序(这两个序列必须要进过排序)
原型:
template <class BidirectionalIterator>
void inplace_merge ( BidirectionalIterator first, BidirectionalIterator middle,
BidirectionalIterator last );

template <class BidirectionalIterator, class Compare>
void inplace_merge ( BidirectionalIterator first, BidirectionalIterator middle,
BidirectionalIterator last, Compare comp );
示例:

//inplace_mergeexample
#include<iostream>
#include
<algorithm>
#include
<vector>
usingnamespacestd;

intmain(){
intfirst[]={5,10,15,20,25};
intsecond[]={50,40,30,20,10};
vector
<int>v(10);
vector
<int>::iteratorit;

sort(first,first
+5);
sort(second,second
+5);

copy(first,first
+5,v.begin());
copy(second,second
+5,v.begin()+5);

inplace_merge(v.begin(),v.begin()
+5,v.end());

cout
<<"Theresultingvectorcontains:";
for(it=v.begin();it!=v.end();++it)
cout
<<""<<*it;

cout
<<endl;

return0;
}


3、includes:测试是一个序列是否在另一个序列中
原型:
template <class InputIterator1, class InputIterator2>
bool includes ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2 );
template <class InputIterator1, class InputIterator2, class Compare>
bool includes ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2, Compare comp );
示例:

//includesalgorithmexample
#include<iostream>
#include
<algorithm>
usingnamespacestd;

boolmyfunction(inti,intj){returni<j;}

intmain(){
intcontainer[]={5,10,15,20,25,30,35,40,45,50};
intcontinent[]={40,30,20,10};

sort(container,container
+10);
sort(continent,continent
+4);

//usingdefaultcomparison:
if(includes(container,container+10,continent,continent+4))
cout
<<"containerincludescontinent!"<<endl;

//usingmyfunctionascomp:
if(includes(container,container+10,continent,continent+4,myfunction))
cout
<<"containerincludescontinent!"<<endl;

return0;
}


4、set_union:和merge类似,不过新序列中没有重复的元素
原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,OutputIterator result );
template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
OutputIterator set_union ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,OutputIterator result, Compare comp );
示例:

//set_unionexample
#include<iostream>
#include
<algorithm>
#include
<vector>
usingnamespacestd;

intmain(){
intfirst[]={5,10,15,20,25};
intsecond[]={50,40,30,20,10};
vector
<int>v(10);//0000000000
vector<int>::iteratorit;

sort(first,first
+5);//510152025
sort(second,second+5);//1020304050

it
=set_union(first,first+5,second,second+5,v.begin());
//51015202530405000

cout
<<"unionhas"<<int(it-v.begin())<<"elements.\n";

return0;
}


5、set_intersection:两个序列的交集
原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,OutputIterator result );
template <class InputIterator1, class InputIterator2,class OutputIterator, class Compare>
OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,OutputIterator result, Compare comp );
示例:

//set_intersectionexample
#include<iostream>
#include
<algorithm>
#include
<vector>
usingnamespacestd;

intmain(){
intfirst[]={5,10,15,20,25};
intsecond[]={50,40,30,20,10};
vector
<int>v(10);//0000000000
vector<int>::iteratorit;

sort(first,first
+5);//510152025
sort(second,second+5);//1020304050

it
=set_intersection(first,first+5,second,second+5,v.begin());
//102000000000

cout
<<"intersectionhas"<<int(it-v.begin())<<"elements.\n";

return0;
}


6、set_difference:序列(first1,last1)不在序列(first2,last2)中的元素
原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,outputIterator result );
template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,OutputIterator result, Compare comp );
示例:

//set_differenceexample
#include<iostream>
#include
<algorithm>
#include
<vector>
usingnamespacestd;

intmain(){
intfirst[]={5,10,15,20,25};
intsecond[]={50,40,30,20,10};
vector
<int>v(10);//0000000000
vector<int>::iteratorit;

sort(first,first
+5);//510152025
sort(second,second+5);//1020304050

it
=set_difference(first,first+5,second,second+5,v.begin());
//515250000000

cout
<<"differencehas"<<int(it-v.begin())<<"elements.\n";

return0;
}


7、set_symmetric_difference:所有不在序列(first1,last1)和序列(first2,last2)中的元素
原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_symmetric_difference ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,OutputIterator result );
template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
OutputIterator set_symmetric_difference ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,OutputIterator result, Compare comp );
示例:

//set_symmetric_differenceexample
#include<iostream>
#include
<algorithm>
#include
<vector>
usingnamespacestd;

intmain(){
intfirst[]={5,10,15,20,25};
intsecond[]={50,40,30,20,10};
vector
<int>v(10);//0000000000
vector<int>::iteratorit;

sort(first,first
+5);//510152025
sort(second,second+5);//1020304050

it
=set_symmetric_difference(first,first+5,second,second+5,v.begin());
//515253040500000

cout
<<"symmetricdifferencehas"<<int(it-v.begin())<<"elements.\n";

return0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值