标准模板库(五):STL算法函数介绍

时间:2022-12-01 04:19:29

1.fill函数:(将输入的值的拷贝赋给范围内的每个元素。)

#include <iostream>
#include<string>
#include <vector>
#include<algorithm>//算法
#include<numeric>
#include <functional>  //定义自己的模板类
//#include <map>
using namespace std;
int main()
{
	int a[]={0,1,5,5,-3,6,3};
	int b[]={0,5,5,5,-3,6,3};
	int len=sizeof(a)/sizeof(a[0]);
	vector<int>v1(a,a+len);
	fill(v1.begin(),v1.end(),4);//每个值变为4
	
	
	return 0;
}

2.fill_n函数:(将输入的值赋值给 first 到 frist+n 范围内的元素。)

#include <iostream>
#include<string>
#include <vector>
#include<algorithm>//算法
#include<numeric>
#include <functional>  //定义自己的模板类
//#include <map>
using namespace std;
int main()
{
	int a[]={0,1,5,5,-3,6,3};
	int b[]={0,5,5,5,-3,6,3};
	int len=sizeof(a)/sizeof(a[0]);
	vector<int>v1(a,a+len);
	fill_n(v1.begin(),3,4);//v1从开始的连续三个数字变为4,其他不变
	
	
	return 0;
}
3.find 函数:利用底层元素的等于操作符,对范围内的元素与输入的值进行比较。当匹配时,结束搜索,返回该元素的一个 InputIterator 。

#include <iostream>
#include<string>
#include <vector>
#include<algorithm>//算法
#include<numeric>
#include <functional>  //定义自己的模板类
//#include <map>
using namespace std;
int main()
{
	int a[]={0,1,5,5,-3,6,3};
	int b[]={0,5,5,5,-3,6,3};
	int len=sizeof(a)/sizeof(a[0]);
	vector<int>v1(a,a+len);
	fill_n(v1.begin(),3,4);
	vector<int>::iterator ite=find(v1.begin(),v1.end(),4);//找到第一个时结束,返回当前值的迭代器
	for(vector<int>::iterator it=ite;it!=v1.end();it++)
		cout<<*it;
	
	
	return 0;
}

4.find_if//find_if_not :(找寻(不)满足条件的数据,与find意思差不多)

#include <iostream>
#include<string>
#include <vector>
#include<algorithm>//算法
#include<numeric>
#include <functional>  //定义自己的模板类
//#include <map>
using namespace std;
bool test(int i)
{
	return(i>10);
}
int main()
{
	int a[]={0,1,5,5,-3,6,3};
	int b[]={0,5,5,5,-3,6,3};
	int len=sizeof(a)/sizeof(a[0]);
	vector<int>v1(a,a+len);
	fill_n(v1.begin(),3,4);
	vector<int>::iterator ite=find_if(v1.begin(),v1.end(),test);//找寻满足条件数据
	if(ite!=v1.end())
		cout<<*ite;
	
	
	return 0;
}

5.find_end函数:( 在一个序列中搜索出最后一个与另一序列匹配的子序列,返回序列的迭代器

#include <iostream>
#include<string>
#include <vector>
#include<algorithm>//算法
#include<numeric>
#include <functional>  //定义自己的模板类
//#include <map>
using namespace std;
int main()
{
	int a[]={0,1,5,5,-3,6,5,5,3};
	int b[]={5,5};
	int len1=sizeof(a)/sizeof(a[0]);
	int len2=sizeof(b)/sizeof(b[0]);
	vector<int>v1(a,a+len1);
	vector<int>v2(b,b+len2);
	vector<int>::iterator ite=find_end(v1.begin(),v1.end(),v2.begin(),v2.end());
	if(ite!=v1.end())
		for (vector<int>::iterator it=ite;it!=v1.end();it++)
		{
			cout<<*it;
		}
	
	
	return 0;
}
输出结果:553

6.find_first_of 函数:(在第一个序列中查找第二个序列中任意一个元素在第一个序列出现的位置。)

#include <iostream>
#include<string>
#include <vector>
#include<algorithm>//算法
#include<numeric>
#include <functional>  //定义自己的模板类
//#include <map>
using namespace std;
int main()
{
	int a[]={0,1,5,5,-3,6,5,5,3};
	int b[]={2,4,1};
	int len1=sizeof(a)/sizeof(a[0]);
	int len2=sizeof(b)/sizeof(b[0]);
	vector<int>v1(a,a+len1);
	vector<int>v2(b,b+len2);
	vector<int>::iterator ite=find_first_of(v1.begin(),v1.end(),v2.begin(),v2.end());//返回找到相同元素在第一个容器中迭代器的位置
	if(ite!=v1.end())
		for (vector<int>::iterator it=ite;it!=v1.end();it++)
		{
			cout<<*it;
		}
	
	
	return 0;
}
7.for_each函数:(对范围内的数据进行操作,类似于for循环)

#include <iostream>
#include<string>
#include <vector>
#include<algorithm>//算法
#include<numeric>
#include <functional>  //定义自己的模板类
using namespace std;
void print_vector(int i)
{
	cout<<i;
}
int main()
{
	int a[]={0,1,5,5,-3,6,5,5,3};
	int b[]={2,4,1};
	int len1=sizeof(a)/sizeof(a[0]);
	int len2=sizeof(b)/sizeof(b[0]);
	vector<int>v1(a,a+len1);
	vector<int>v2(b,b+len2);
	for_each(v1.begin(),v1.end(),print_vector);//对每个数据进行打印
	
	
	return 0;
}
8.generate 函数/generate_n 函数:(利用一个函数产生数据填充到相应的区域内,与fill,fill_n的用法类似)

#include <iostream>
#include<string>
#include <vector>
#include<algorithm>//算法
#include<numeric>
#include <functional>  //定义自己的模板类
using namespace std;
int aa()
{ 
	static int b=1;
	return (++b);
}
void print_v(int i)
{
	cout<<i;
}
int main()
{
	int a[]={0,1,5,5,-3,6,5,5,3};
	int b[]={2,4,1};
	int len1=sizeof(a)/sizeof(a[0]);
	int len2=sizeof(b)/sizeof(b[0]);
	vector<int>v1(a,a+len1);
	vector<int>v2(b,b+len2);
	generate(v1.begin(),v1.end(),aa);
	for_each(v1.begin(),v1.end(),print_v);
	
	return 0;
}
9.includes函数:(判断第二个子串是否包含在第一个串里面,不一定要连续,如果包含在里面就返回true, 一定要排好序的
#include <iostream>
#include<string>
#include <vector>
#include<algorithm>//算法
#include<numeric>
#include <functional>  //定义自己的模板类
using namespace std;
int aa()
{ 
	static int b=1;
	return (++b);
}
void print_v(int i)
{
	cout<<i;
}
int main()
{
	int a[]={0,1,5,5,-3,6,5,5,3};
	int b[]={1,5,6,-3};
	int len1=sizeof(a)/sizeof(a[0]);
	int len2=sizeof(b)/sizeof(b[0]);
	vector<int>v1(a,a+len1);
	vector<int>v2(b,b+len2);
	<span style="color:#3333ff;">sort(v1.begin(),v1.end());//-3 0 1 3 5 5 5 5 6 
	sort(v2.begin(),v2.end());//-3 1 5 6</span>
	bool ite=includes(v1.begin(),v1.end(),v2.begin(),v2.end());//返回值是true。
	for_each(v1.begin(),v1.end(),print_v);
	
	return 0;
}
10.inner_product 函数:(对两个序列做内积 ,并将内积加到一个输入的的初始值上。 内积要求第二个序列长度要大于第一个序列长度

#include <iostream>
#include<string>
#include <vector>
#include<algorithm>//算法
#include<numeric>
#include <functional>  //定义自己的模板类
using namespace std;
int main()
{
	int a[]={0,1,5,5};
	int b[]={1,5,6,-3};
	int len1=sizeof(a)/sizeof(a[0]);
	int len2=sizeof(b)/sizeof(b[0]);
	vector<int>v1(a,a+len1);
	vector<int>v2(b,b+len2);
	int aa=inner_product(v1.begin(),v1.end(),v2.begin(),0);//最后这个参数是初值
	
	return 0;
}
第二个应用:就是定义两个函数去代替原来内积公式里面的+和*:

#include <iostream>
#include<string>
#include <vector>
#include<algorithm>//算法
#include<numeric>
#include <functional>  //定义自己的模板类
using namespace std;
int test1(int a,int b)
{
	return a*b;
}
int test2(int a,int b)
{
	return 2*a;
}
int main()
{
	int a[]={1,2};
	int b[]={2,2};
	int len1=sizeof(a)/sizeof(a[0]);
	int len2=sizeof(b)/sizeof(b[0]);
	vector<int>v1(a,a+len1);
	vector<int>v2(b,b+len2);
	int aa=inner_product(v1.begin(),v1.end(),v2.begin(),0,test1,test2);//第一个函数代替加,第二个代替乘
	
	return 0;
}