算法主要头文件:
<algorithm> 体积最大,涉及比较,交换,查找,遍历操作,复制,修改等
<numeric> 体积小,简单数据运算模板函数
<functional> 定义模板类,声明函数对象
常用遍历算法
for_each( iterator beg,iterator end,_func ) //遍历容器
transform( iterator beg1,iterator end1,iterator beg2,_func ) //搬运容器到另一个容器中
#include<algorithm>
#include<vector>
class ToDo
{
public:
int operator(int v)
{
return v;
}
}
toDo(){}
int main()
{
vector<int> v;
for(int i=0;i<10;i+)
v.push_back(i);
//for_each遍历
for_each(v.begin(),v.end(),toDo);
//for_each(v.begin(),v.end(),ToDo()); //ToDo为仿函数
//transform搬运
vector<int> vTarget; //目标容器
vTarget.resize(v.size()); //提前开辟空间
transform(v.begin(),v.end(),vTarget.begin);
//transform(v.begin(),v.end(),vTarget.begin,ToDo()); //ToDo为仿函数(逻辑运算)
system("pause");
return 0;
}
常用查找算法
find( iterator beg,iterator end,value ) //查找元素(返回 迭代器)找到一个即停止
find_if( iterator beg,iterator end,_Pred ) //按条件查找元素(返回 迭代器)找到一个即停止
adjacent_find( iterator beg,iterator end ) //查找相邻重复元素(返回 [第一位置]迭代器)
binary_search( iterator beg,iterator end,value ) //二分查找法 (仅有序序列,返回 bool)
count( iterator beg,iterator end ) //统计某元素个数(返回 个数)
count_if( iterator beg,iterator end,_Pred ) //按照条件统计元素个数
#include <vertor>
#include <algorithm>
class GreaterFive
{
public:
bool operator(int val)
{
return val > 5;
}
}
int main()
{
vertor<int> v;
for(int i=0;i<10;i++)
v.push_back(i);
//find()
vertor<int>:: it1 = find(v.begin,v.end(),5);
if(it == v.end()){} //未找到
//find_if()
vertor<int>:: it2 = find_if(v.begin,v.end(),GreaterFive()); //greater()内仿函数
if(it == v.end()){} //未找到
vertor<int> v1;
v1.push_back(4);
v1.push_back(1);
v1.push_back(3); //返回位置
v1.push_back(3);
v1.push_back(2);
//adjacent_find()
vertor<int>:: it3 = adjacent_find(v1.begin,v1.end());
if(it == v.end()){} //未找到
//binary_search
bool flag = binary_search(v.begin,v.end(),5);
//count
int num1 = count(v1.begin,v1.end(),3);
//count_if
int num2 = count_if(v.begin,v.end(),GreaterFive());
system("pause");
return;
}
常用排序算法
sort( iterator beg,iterator end,_Pred ) //对容器内元素排序
random_shuffic( iterator beg,iterator end ) //洗牌,范围里随机调整位置
merge( iterator beg1,iterator end1 ,iterator beg2,iterator end2 ,iterator dest) //容器元素合并,储存到另一容器(两容器必须有序)
reverse( iterator beg,iterator end ) //反转指定范围的元素
#include <vertor>
#include <algorithm>
#include <functional>
int main()
{
vertor<int> v,v2;
for(int i=0;i<10;i++)
v.push_back(i);
for(int i=10;i<30;i++)
v2.push_back(i);
//sort
sort(v.begin,v.end());
sort(v.begin,v.end(),greater<int>()); //降序
//random_shuffic
random_shuffic(v.begin,v.end());
//merge
vertor<int> newV;
newV.resize(v.size()+v2.size()); //开辟空间
merge(v.begin,v.end(),v2.begin,v2.end(),newV.begin())
//reverse
reverse(v.begin,v.end());
system("pause");
return 0;
}
常用拷贝和替代算法
copy( iterator beg,iterator end ,iterator dest ) //容器内指定范围的元素拷贝到另一个容器中
replace( iterator beg,iterator end,oldValue,newValue ) //将容器内指定范围的旧元素修改为新元素
replace_if( iterator beg,iterator end,_pred,newValue ) //容器内指定范围满足条件的元素替代为新元素
swap( container c1, container c2 ) //互换两容器的元素
#include <vertor>
#include <algorithm>
#include <functional>
class Greater5
{
public:
bool operator()(int val)
{
return val>5;
}
}
int main()
{
vertor<int> v,v2;
for(int i=0;i<10;i++)
v.push_back(i);
for(int i=10;i<30;i++)
v2.push_back(i);
//copy
vertor<int> tmpV;
tmpV.resize(v.size());
copy(v.begin,v.end(),tmpV.begin);
//replace
replace(v.begin,v.end(),5,80);
//replace_if
replace_if(v.begin,v.end(),Greater5(),80); //Greater5仿函数
//swap
swap(v,v2);
system("pause");
return 0;
}
常用算术生成算法
accumulate( iterator beg,iterator end,value ) //计算容器元素累计总和
fill( iterator beg,iterator end,value ) //向容器中添加元素
#include <vertor>
#include <numeric>
class Greater5
{
public:
bool operator()(int val)
{
return val>5;
}
}
int main()
{
vertor<int> v;
for(int i=0;i<10;i++)
v.push_back(i);
//accumulate
int total = accumulate(v.begin(),v.end(),0); //0:初始累加值
//fill
vertor<int> tmpV;
tmpV.resize(100);
fill(tmpV.begin(),tmpV.end(),100);
system("pause");
return 0;
}
常用集合算法
set_intersection( iterator beg1,iterator end1 ,iterator beg2,iterator end2,iterator dest ) //求两容器的交集(有序序列,返回容器最后迭代器地址)
set_union( iterator beg1,iterator end1 ,iterator beg2,iterator end2,iterator dest ) //求两容器的并集(有序序列,返回容器最后迭代器地址)
set_difference( iterator beg1,iterator end1 ,iterator beg2,iterator end2,iterator dest ) //求两容器的差集(有序序列,返回容器最后迭代器地址)
#include <vertor>
#include <algorithm>
int main()
{
vertor<int> v,v2;
for(int i=0;i<10;i++)
v.push_back(i);
for(int i=5;i<30;i++)
v2.push_back(i);
//set_intersection
vertor<int> interV;
interV.resize(min(v.size(),v2.size())); //最小空间
vertor<int>::iterator itEndInter
= set_intersection(v.begin(),v.end(),v2.begin(),v2.end(),interV.begin());
//set_union
vertor<int> unionV;
unionV.resize(v.size()+v2.size()); //特殊状况空间
vertor<int>::iterator itEndUnion
= set_union(v.begin(),v.end(),v2.begin(),v2.end(),unionV.begin());
//set_difference
vertor<int> diffV;
diffV.resize(v.size()+v2.size()); //特殊状况空间
vertor<int>::iterator itEndDiff
= set_difference(v.begin(),v.end(),v2.begin(),v2.end(),diffV.begin());
system("pause");
return 0;
}