STL算法库-排序和相关操作(二)

来源:互联网 发布:c语言苏小红版答案 编辑:程序博客网 时间:2024/06/08 08:43
六、合并排序
6.1 两个已序集合的总和(merge)
原型:merge(iterator1 first1,iterator1 last1,iterator2 first2,iterator last2,OutputIterator dest)
定义:将两个已序集合进行合并,合并后进行重新排序,不排除重复元素,必须保证原序列有序
原型:merge(iterator1 first1,iterator1 last1,iterator2 first2,iterator2 last2,OutputIterator dest,Compare comp)
定义:comp可以控制升序还是降序,实际上可以省略,源序列为升序的话comp设置降序也会无效

6.2 两个已序集合的并集(set_union)
原型:set_union(iterator1 first1,iterator1 last1,iterator2 first2,iterator2 last2,OutputIterator dest)
定义:将两个已序集合进行并集,合并后重新排序,排除重复元素,当源区间本身有重复元素时,保留这些元素,必须保证原序列有序
原型:set_union(iterator1 first1,iterator1 last1,iterator2 first2,iterator 2 last2,OutputIterator dest,Compare comp);
定义:comp可以控制升序还是降序,实际上可以省略,原序列为升序的话comp设置降序也会无效

6.3 两个已序集合的交集(set_intersection)
原型:set_intersection(iterator1 first1,iterator1 last1,iterator2 first2,iterator2 last2,OutputIterator dest)
定义:将两个已序集合进行交集,目标集合为两个集合共同含有的元素,当源区间本身具有重复元素时,保留这些重复元素,必须保证原序列有序
原型:set_intersection(iterator1 first1,iterator1 last1,iteraotr2 first2,iterator2 last2,OutputIterator dest,Compare comp)
定义:comp可以控制升序还是降序,实际上可以省略,原序列为升序的话comp设置降序也会无效

6.4 两个已序集合的差集(set_difference)
原型:set_difference(iterator1 first1,iterator1 last1,iterator2 first2,iterator2 last2,OutputIterator dest)
定义:将区间[first1,last1]中有,[first2,last2]中没有的元素保存到以dest开头的区间中
原型:set_difference(iterator1 first1,iterator2 last1,iteraor2 first2,iterator2 last2,OutputIterator dest,Compare comp)
定义:comp可以控制升序还是降序,实际上可以省略,源序列为升序的话comp设置降序也会无效

6.5 连贯的已序区间合并算法(impalce_merge)
原型:inplace_merge(iterator first,iterator middle,iterator last)
定义:将已序区间[first,middle]和[middle,last]进行合并,使[first,last]为两个区间的和
原型:inplace merge(iterator first,iterator middle,iterator last,Compare comp)
定义:comp可以控制升序还是降序,实际上可以省略,源序列为升序的话comp设置降序也会无效

示例代码:

#include "stdafx.h"#include "iostream"#include "list"#include "set"#include "algorithm"#include "functional"#include "iterator"using namespace std;void print(int& elem){ cout<<elem<<" ";}int _tmain(int argc, _TCHAR* argv[]){ int dim[]={1,2,3,4,5,6,7,8}; int dim2[]={3,4,5,6,7,8,9,10}; list<int> l1; set<int> s1; l1.assign(dim,dim+8); for(int i=0;i<sizeof(dim2)/sizeof(int);i++)  s1.insert(dim2[i]); cout<<"list l1: "<<endl; copy(l1.begin(),l1.end(),ostream_iterator<int>(cout," ")); cout<<endl; cout<<"set s1:"<<endl; copy(s1.begin(),s1.end(),ostream_iterator<int>(cout," ")); cout<<endl; cout<<"l1 and s1 are merged"<<endl; merge(l1.begin(),l1.end(),s1.begin(),s1.end(),ostream_iterator<int>(cout," "),less<int>()); cout<<endl; cout<<"l1 and s1 are unioned"<<endl; set_union(l1.begin(),l1.end(),s1.begin(),s1.end(),ostream_iterator<int>(cout," ")); cout<<endl; cout<<"l1 and s1 are intersectoned"<<endl; set_intersection(l1.begin(),l1.end(),s1.begin(),s1.end(),ostream_iterator<int>(cout," ")); cout<<endl; cout<<"l1 and s1 are merged by algorithm inplace_merge: "<<endl; copy(s1.begin(),s1.end(),back_inserter(l1)); list<int>::iterator pos; pos = find(l1.begin(),l1.end(),3); pos = find(++pos,l1.end(),3); pos++; inplace_merge(l1.begin(),pos,l1.end(),less<int>()); //l1.sort(); for_each(l1.begin(),l1.end(),print); cout<<endl; return 0;}

七、搜索
7.1 binary_search()算法(使用该算法之前,区间必须是已序的)
原型:bool binary_search(iterator first,iterator last,const T& Value)
定义:判断已序区间[first,last]中是否含有值为Value的元素
原型:bool binary_search(iterator first,iterator last,const T& Value,Comepar comp)
定义:判断已序区间[first,last]中是否含有值为Value的元素,Comp是一个可有可无的二元判断式,用来做排序准则

7.2 includes()算法
原型:bool includes(iterator1 first1,iterator1 last1,iterator2 first2,iterator2 last2)
定义:检查[first1,last1]中是否存在区间[first2,last2]
原型:bool includes(iterator1 first1,iterator1 last1,iterator2 first2,iterator2 last2,Compare comp)
定义:检查[first1,last1]中是否存在区间[first2,last2],Comp是一个可有可无的二元判断式,用来做排序准则

7.3 搜索第一个或(和)最后一个可能位置
原型:lower_bound(iterator first,iterator last ,const T& value)
定义:返回第一个大于等于value的元素的位置
原型:upper_bound(iterator first,iterator last ,const T& value)
定义:返回第一个大于value的元素的位置
原型:euqal_range(iterator first,iterator last ,const T& value)
定义:返回等于value的元素的位置的pair

上述被搜索的区间必须是已序的,还有一种形式后面有用来表示顺序的判断式comp,可有可无

示例代码如下:

#include "stdafx.h"#include "iostream"#include "list"#include "set"#include "algorithm"#include "functional"#include "iterator"using namespace std;int _tmain(int argc, _TCHAR* argv[]){ int dim[]={1,2,4,5,7,3,3}; int dim1[]={4,5}; multiset<int> s1; list<int> l1; for(int i=0;i<7;i++)  s1.insert(dim[i]); l1.assign(dim,dim+2); copy(s1.begin(),s1.end(),ostream_iterator<int>(cout," ")); cout<<endl; if(binary_search(s1.begin(),s1.end(),3))  cout<<"找?到?元a素?3"<<endl; if(includes(s1.begin(),s1.end(),l1.begin(),l1.end()))  cout<<"s1中D包?含?元a素?4、?"<<endl; multiset<int>::iterator it1=lower_bound(s1.begin(),s1.end(),3); cout<<"找?到?元a素?3的?下?边?界?位?置?是?"<<distance(s1.begin(),it1)<<endl; it1=upper_bound(s1.begin(),s1.end(),3); cout<<"找?到?元a素?3的?上?边?界?位?置?是?"<<distance(s1.begin(),it1)<<endl; pair<multiset<int>::iterator,multiset<int>::iterator> Setpair = equal_range(s1.begin(),s1.end(),3); return 0;}



0 0
原创粉丝点击