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

六、合并排序
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值