stl常用算法总结

stl的算法简单概念
算法(algorithm)是用模板技术实现的适用于各种容器的通用程序。算法常常通过迭代器间接地操作容器元素,而且通常会返回迭代器作为算法运算的结果。
STL大约提供了70个算法,每个算法都是一个模板函数或者一组模板函数,能够在许多不同类型的容器上进行操作,各个容器则可能包含着不同类型的数据元素。STL中的算法覆盖了在容器上实施的各种常见操作,如遍历、排序、检索、插入及删除元素等操作
1、find/count算法
find用于查找指定数据在某个区间中是否存在,该函数返回等于指定值的第一个元素位置,如果没有找到就返回最后元素位置;count用于统计某个值在指定区间出现的次数,
其用法如下:

find(beg,end,value)//[beg, end]是指定的区间,常用迭代器位置描述该区间,value是要查找或统计的值。
count(beg,end,value) 

运用实例:

		int arr[]={100,200,300,400,500,500,600,700,800,900,1000};
		int *ptr;
		ptr=find(arr,arr+9,400);		//查找400在arr数组中的地址
		cout<<"数据在数组中的下标是:" <<ptr-arr<<endl;  //find返回地址,
		list<int> L1;          			//定义链表L1
		int a1[]={30,40,50,60,60,60,80};
		for(int i=0;i<7;i++)
			L1.push_back(a1[i]);   		//将a1数组加入到L1链表中
		list<int>::iterator pos;
		pos=find(L1.begin(),L1.end(),80);				
		if(pos!=L1.end()) 
	         cout<<"L1链表中存在数据元素:“<<*pos;	//输出找到的数据
		cout<<",它是链表中的第:“ <<distance(L1.begin(),pos)+1<<"个节点!"<<endl;  //distance计算迭代器与链首元素间隔的元素个数
		int n1=count(arr,arr+10,500);	//统计arr数组中500的个数
		int n2=count(L1.begin(),L1.end(),60);//统计L1链表中60的个数
		cout<<"arr 数组中有:"<<n1<<"个"<<500<<endl;
		cout<<"L1链表中有:"<<n2<<"个"<<60<<endl;
}

2、search算法
search算法则是从一个容器查找由另一个容器所指定的顺序值。
search用法形式如下:

search(beg1,end1,beg2,end2)

search将在[beg1, end1]区间内查找有无与[beg2, end2]相同的子区间,如果找到就返回[beg1, end1]内第一个相同元素的位置,如果没找到,返回end1; search将在[beg1, end1]区间内查找有无与[beg2, end2]相同的子区间,如果找到就返回[beg1, end1]内第一个相同元素的位置,如果没找到,返回end1
应用实例:

		int a1[]={10,20,30,40,50,60,70,80};
		int a2[]={40,50,60};
		int *ptr;
		ptr=search(a1,a1+8,a2,a2+3);	 //查找a2数组在a1中的位置
		if(ptr==a1+8)	
			cout<<"no match found\n";
		else
			cout<<"a2 match a1 at:"<<(ptr-a1)<<endl; //输出第一个匹配元素的位置
		vector<int> v;
		list<int> L;
		for(int i=0;i<8;i++)	
			v.push_back(a1[i]);      //将a1数组插入v向量
		for(int j=0;j<3;j++)	
			L.push_back(a2[j]);      //将a2数组插入L链表
		vector<int>::iterator pos;
		pos=search(v.begin(),v.end(),L.begin(),L.end());    
			  //在v中查找L
		cout<<distance(v.begin(),pos)<<endl;
			//distance计算找到元素在V中的下标

3、merge算法
merge可对两容器进行合并,将结果存放在第3个容器中,
其用法如下:

merge(beg1,end1,beg2,end2,dest)

merge将[beg1, end1]与[beg2, end2]区间合并,把结果存放在dest容器中。如果参与合并的两个容器中的元素是有序的,则合并的结果也是有序的。
应用实例:

		int a2[]={40,50,60};
		int a[10];
		merge(a1,a1+7,a2,a2+3,a);//将a1、a2合并,结果放在a数组中
		for(int i=0;i<10;i++)
			cout<<a[i]<<"\t";
		cout<<endl;
		list<int> L1,L2;                    
		list<int>::iterator pos;	//pos迭代器用于输出链表元素
		for(i=0;i<7;i++)
			L1.push_back(a1[i]);     		//插入L1的链表元素
		for(int j=0;j<3;j++)
			L2.push_back(a2[j]);   		//插入L2的链表元素
		L1.merge(L2);	//用list的merge成员合并L1、L2
		for(pos=L1.begin();pos!=L1.end();pos++)   //用迭代器pos输出合并后的L1
			cout<<*pos<<"\t";
		cout<<endl;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值