STL的算法函数,stl算法库中常用算法
概述算法主要是由头文件算法、函数、数字组成,其中算法头文件最为常见
1.常用的遍历算法对于每个和转换对于每个函数原型:for_each(迭代器求求,迭代器end,_func)
//乞讨开始迭代器
//结束结束迭代器
//_func函数或者函数对象(仿函数)
例:
void print01(int v)
{
cout v
}
类别打印02
{
公共:
空的运算符()(int c)
{
cout c
}
};
int main()
{
向量整数
for(int I=0;我我)
五、推回(一);
for_each(v.begin(),v.end(),print 01);//传入函数
cout结束
for_each(v.begin(),v.end(),print 02());//传入函数对象
返回0;
}
改变函数原型:转换(迭代器beg1,迭代器end1,迭代器beg2,_func)
//beg1源容器开始迭代器
//end1源容器结束迭代器
//beg2目标容器开始迭代器
//_func函数或者函数对象
例:
类别打印02
{
公共:
空的运算符()(int c)
{
cout c
}
};
类别转换
{
公共:
(同Internationalorganizations)国际组织运算符()(int c)
{
返回c;
}
};
int main()
{
向量整数
for(int I=0;我我)
五、推回(一);
向量整数
v2。resize(v . size());
transform(v.begin(),v.end(),v2.begin(),Transform());
for_each(v2.begin(),v2.end(),print 02());
cout结束
返回0;
}
2.常用查找算法发现函数原型
查找(迭代器求求,迭代器结束,值)
//按值查找元素,找到返回指定位置的迭代器,找不到返回结束迭代器位置
//乞讨开始迭代器
//结束结束迭代器
//值查找的元素
例:
查找自定义数据类型,要重载==运算符,这样发现函数知道该如何比较
阶级人士
{
公共:
人员(字符串名称,整数)
{
m _ name=名称
m_age=年龄;
}
布尔运算符==(常量人p)
{
if(this-m _ age==p . m _ age this-m _ name==p . m _ name)
返回真实的
其他
返回错误的
}
字符串男名
中间年龄
};
int main()
{
向量整数
for(int I=0;我我)
五、推回(一);
vector int:iterator it=find(v . begin(),v.end(),4);
如果(它!=v.end())
cout 找到元素: * it endl
其他
cout 没有找到元素恩德尔
//查找自定义数据类型
载体人
人P1(‘AAA’,111);
人p2(BBB ,222);
人p3(ccc ,333);
人p4(ddd ,444);
v2。push _ back(P1);
v2。push _ back(p2);
v2。push _ back(P3);
v2。push _ back(P4);
vector Person:迭代器IT=find(v2。begin(),v2.end(),p2);
如果(它!=v2.end())
cout 找到元素: IT-m _ name IT-m _ age endl;
其他
cout 没有找到元素恩德尔
返回0;
}
查找_如果函数find_if(迭代器求求,迭代器完,_Pred)
//按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
//乞讨开始迭代器
//结束结束迭代器
//_Pred函数或者谓词(布尔类型的仿函数)类人
{
公共:
人员(字符串名称,整数)
{
m _ name=名称
m_age=年龄;
}
字符串男名
中间年龄
};
类别比较
{
公共:
布尔运算符()(int val)
{
返回值
}
};
类别比较2
{
公共:
布尔运算符()(个人p)
{
返程下午_年龄300;
}
};
int main()
{
向量整数
for(int I=0;我我)
五、推回(一);
vector int:iterator it=find _ if(v . begin()、v.end()、Compare());
如果(它!=v.end())
cout 找到元素: * it endl
其他
cout 没有找到元素恩德尔
//查找自定义数据类型
载体人
人P1(‘AAA’,111);
人p2(BBB ,222);
人p3(ccc ,333);
人p4(ddd ,444);
v2。push _ back(P1);
v2。push _ back(p2);
v2。push _ back(P3);
v2。push _ back(P4);
载体人:迭代器IT=find_if(v2.begin(),v2.end(),compare 2());
如果(它!=v2.end())
cout 找到元素: IT-m _ name IT-m _ age endl;
其他
cout 没有找到元素恩德尔
返回0;
}
相邻_查找函数相邻_查找(迭代器求求,迭代器结束)
//查找相邻重复元素,返回相邻元素的第一个位置的迭代器
//乞讨开始迭代器
//结束结束迭代器int main()
{
向量整数
for(int I=0;我我)
五、推回(一);
五、push _ back(10);
vector int:iterator it=adjacent _ find(v . begin()、v . end());
如果(它!=v.end())
cout 找到有相邻重复元素,为: * it endl
其他
cout 没有找到恩德尔
返回0;
}
二进制搜索函数布尔二进制搜索(迭代器求求,迭代器结束,值)
//查找指定的元素,查到返回没错,否则错误的
//乞讨开始迭代器
//结束结束迭代器
//值查找的元素
!注意:二进制搜索函数一定是在有序序列中查找,不能在无序序列进行查找int main()
{
向量整数
for(int I=0;我我)
五、推回(一);
bool res=binary_search(v.begin(),v.end(),4);
中频(分辨率)
cout 找到了恩德尔
其他
cout 没有找到元素恩德尔
返回0;
}
数数函数计数(迭代器求求,迭代器结束,值)
//统计元素出现次数
//乞讨开始迭代器
//结束结束迭代器
//值统计的元素阶级人士
{
公共:
人员(字符串名称,整数)
{
m _ name=名称
m_age=年龄;
}
布尔运算符==(常量人p)
{
if (this- m_age==p.m_age)
返回真实的
其他
返回错误的
}
字符串男名
中间年龄
};
int main()
{
向量整数
for(int I=0;我我)
五、推回(一);
int num=count(v.begin(),v.end(),8);
cout 统计8的个数为:数量结束
//统计自定义类型的个数,需要重载==运算符
载体人
人员p1(张飞, 35);
人员p2(刘备,30);
人员p3(关羽, 35);
人员p4(孙尚香, 20);
人员p5(孙权, 25);
v2。push _ back(P1);
v2。push _ back(p2);
v2。push _ back(P3);
v2。push _ back(P4);
v2。push _ back(P5);
num=count(v2.begin(),v2.end(),P1);
cout 统计年龄和张飞一样的总人数为:数量结束
返回0;
}
count_if函数count_if(迭代器求求,迭代器完,_Pred)
//按条件统计元素出现个数
//乞讨开始迭代器
//结束结束迭代器
//_Pred谓词类别比较
{
公共:
布尔运算符()(int val)
{
返回值
}
};
void test01()
{
向量整数
for(int I=0;我我)
五、推回(一);
int num=count_if(v.begin(),v.end(),Compare());
cout 大于四的统计个数为:数量结束
}
阶级人士
{
公共:
人员(字符串名称,整数)
{
m _ name=名称
m_age=年龄;
}
字符串男名
中间年龄
};
类别比较2
{
公共:
布尔运算符()(常量人员p)
{
如果(下午_年龄22)
返回真实的
其他
返回错误的
}
};
void test02()
{
载体人
人员p1(张飞, 24);
人员p2(刘备, 22);
人员p3(关羽, 25);
人员p4(孙尚香, 18);
人员p5(狄仁杰, 20);
v2。push _ back(P1);
v2。push _ back(p2);
v2。push _ back(P3);
v2。push _ back(P4);
v2。push _ back(P5);
int num=count_if(v2.begin(),v2.end(),compare 2());
cout 岁数比张飞大的人数为:数量结束
}
int main()
{
测试01();
测试02();
返回0;
}
3.常用排序算法分类函数排序(迭代器求求,迭代器完,_Pred)
//默认排序从小到大
//_Pred谓词作废打印(中间值)
{
cout val
}
void test01()
{
向量整数
for(int I=10;我我-)
五、推回(一);
sort(v.begin()、v . end());
for_each(v.begin(),v.end(),print);
cout结束
sort(v.begin(),v.end(),greater int //逆序排列
for_each(v.begin(),v.end(),print);
}
随机洗牌函数随机洗牌(迭代器求求,迭代器结束)
//指定范围内的元素随机调整次序作废打印(中间值)
{
cout val
}
void test01()
{
向量整数
for(int I=10;我我-)
五、推回(一);
random_shuffle(v.begin()、v . end());
for_each(v.begin(),v.end(),print);
}
为了改变随机数,可以加一个随机种子srand((无符号)时间(空))
合并函数合并(迭代器beg1,迭代器end1,迭代器beg2,迭代器end2,迭代器目标)
//两容器合并,并存储到另一容器中
//注意:两容器必须是有序的
//目标目标容器开始迭代器作废打印(中间值)
{
cout val
}
void test01()
{
向量整数
for(int I=0;我我)
v1。push _ back(一);
向量整数
for(int I=5;我我)
v2。push _ back(一);
向量整数
v3。调整大小(10);
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v3。begin());
for_each(v3.begin(),v3.end(),print);
}
反面的函数反向(迭代器求求,迭代器结束)
//反转指定容器的元素作废打印(中间值)
{
cout val
}
void test01()
{
向量整数
for(int I=0;我我)
v1。push _ back(一);
reverse(v1.begin()、v1。end());
for_each(v1.begin(),v1.end(),print);
}
4.常用拷贝和替换函数复制函数复制(迭代器求求,迭代器结束,迭代器目标)
//将一个容器元素拷贝到另一个容器中
//目标目标开始迭代器作废打印(中间值)
{
cout val
}
void test01()
{
向量整数
for(int I=0;我我)
v1。push _ back(一);
向量整数
v2。调整大小(5);
copy(v1.begin(),v1.end(),v2。begin());
for_each(v2.begin(),v2.end(),print);
}
替换函数替换(迭代器求求,迭代器end,oldvalue,newvalue)
//旧值要替换的数据
//新值替换后的数据作废打印(中间值)
{
cout val
}
void test01()
{
向量整数
for(int I=0;我我)
v1。push _ back(一);
replace(v1.begin(),v1.end(),22000);//将2替换成了2000
for_each(v1.begin(),v1.end(),print);
}
替换_如果函数replace_if(迭代器求求,迭代器end,_Pred,新价值)
//_Pred谓词,满足条件的数据被替换成新价值
作废打印(中间值)
{
cout val
}
类别比较
{
公共:
布尔运算符()(int val)
{
返回值
}
};
void test01()
{
向量整数
for(int I=0;我我)
v1。push _ back(一);
cout 替换前:;
for_each(v1.begin(),v1.end(),print);
replace_if(v1.begin(),v1.end(),Compare(),3000);//大于3的数据被替换成3000
cout endl 替换后:;
for_each(v1.begin(),v1.end(),print);
}
交换函数交换(容器c1,容器c2)
//交换两个容器的元素作废打印(中间值)
{
cout val
}
void test01()
{
向量int v1,v2;
for(int I=0;我我)
v1.push_back(i),v2。push _ back(I * 2);
cout 交换前: endl
for_each(v1.begin(),v1.end(),print);
cout结束
for_each(v2.begin(),v2.end(),print);
swap(v1,v2);
cout endl 交换后: endl
for_each(v1.begin(),v1.end(),print);
cout结束
for_each(v2.begin(),v2.end(),print);
cout结束
}
5.常用算术生成函数这类算法属于小型算法,使用时要包含头文件数字的
积聚函数累加(迭代器求求,迭代器结束,值)
//计算容器元素累计总和
//值起始值作废打印(中间值)
{
cout val
}
void test01()
{
向量整数
for(int I=0;我我)
v1。push _ back(一);
int total=accumulate(v1.begin(),v1.end(),0);
cout total= total endl
}
充满函数填充(迭代器求求,迭代器结束,值)
//向容器中填充元素
//值填充的值作废打印(中间值)
{
cout val
}
void test01()
{
向量整数
v1。调整大小(10);
//后期填充
fill(v1.begin(),v1.end(),1000);
for_each(v1.begin(),v1.end(),print);
}
6.常用集合函数集合_交集函数集合_交集(迭代器beg1,迭代器end1,迭代器beg2,迭代器end2,迭代器目标)
//求两个集合的交集(注意!这两个集合的元素必须是有序的)
//beg1容器一开始迭代器
//end1容器一结束迭代器
//beg2容器2开始迭代器
//end2容器2结束迭代器
//目标目标容器开始迭代器作废打印(中间值)
{
cout val
}
void test01()
{
向量int v1,v2,v3;
for(int I=0;我我)
v1。push _ back(一);
for(int I=0;我我)
v2。push _ back(一);
v3.resize(min(v1.size()、v2。size());
vector int:iterator it=set _ intersection(v1。begin(),v1.end(),v2.begin(),v2.end(),v3。begin());
for_each(v3.begin(),it,print);
}
集合_联合函数set_union(迭代器beg1,迭代器end1,迭代器beg2,迭代器end2,迭代器目标)
//求两个集合的并集(注意!两个集合必须是有序的)
//目标目标容器开始迭代器
//目标容器开辟空间需要两个容器相加
//集_联合返回值是并集中最后一个的位置作废打印(中间值)
{
cout val
}
void test01()
{
向量int v1,v2,v3;
for(int I=0;我我)
v1。push _ back(一);
for(int I=0;我我)
v2。push _ back(一);
v3。调整大小(v1。大小()v2。size());
vector int:iterator it=set _ union(v1。begin(),v1.end(),v2.begin(),v2.end(),v3。begin());
for_each(v3.begin(),it,print);
}
集合_差异函数set_difference(迭代器beg1,迭代器end1,迭代器beg2,迭代器end2,迭代器目标)
//求两个集合的差集(注意!这两个集合必须是有序序列)
//目标容器开始迭代器
//目标容器需要从两个容器中取最大值来打开空间。
//set_difference的返回值是差集void print(int val)中最后一个元素的位置
{
cout val“”;
}
void test01()
{
向量int v1,v2,v3;
for(int I=0;我我)
v1 . push _ back(I);
for(int I=10;我我)
v2 . push _ back(I);
v3.resize(max(v1.size()、v2 . size());
vector int:iterator it=set _ difference(v1 . begin(),v1.end(),v2.begin(),v2.end(),v3 . begin());
cout v1和v2的差异集:;
for_each(v3.begin(),it,print);
it=set_difference(v2.begin(),v2.end(),v1.begin(),v1.end(),v3 . begin());
couendl v2和v1之间的差异:;
for_each(v3.begin(),it,print);
}
版权归作者:别跑Ang,,请联系作者获得转载许可,否则将承担法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。