常用的算法基本包含在< algorithm > < functional >< numeric >文件下
< algorithm >是STL文件中最大的一个,主要涉及比较、交换、查找、遍历操作、复制、修改等
< functional >体积小,只包括几个在序列上面进行简单数学运算的模板函数
< functional >定义了一些模板类,用来声明函数对象
遍历算法
函数原型 :
//遍历容器
//beg、end、开始和结束迭代器
//_func 函数或者函数对象
//调用函数其实就是遍历的时候每次把迭代器指向的容器里的内容都给函数或者函数对象调用
for_each(itertor beg,iterator end,func);
//beg1,end1源容器开始和结束迭代器
//beg2目标容器起始迭代器
//_func 函数或者函数对象,搬运时对数据的处理,不处理就创建个函数,直接return就行
//使用该函数,可能需要对目标容器resize开空间
transform(itertor beg1,iterator end1,itertor beg2,func);
//例子:不处理数据怎么写函数对象类
class Transsform
{
public:
int operator()(int val)
{
//注意,传进来什么类型参数就要返回去什么类型参数,因为这里不对数据进行处理
//传进来的参数就是源容器里的数据
return val;
}
};
查找算法
函数原型 :
在使用自定义数据类型进行查找时,编译器不知道怎么判断,而底层算法实现是调用迭代器进行value的判断,所以我们需要重载判断运算符,如==,>=,<=,需要在自定义数据类型内部进行重载
//查找元素,找到返回迭代器位置,找不到返回end迭代器 查找自定义类型需要重载==,
find(itertor beg,iterator end,value);
//按条件查找元素,_Pred函数或者谓词,返回值为bool,说明查找条件
//这里的函数其实也是一直把迭代器指向的内容传递给函数调用,只不过这里是进行判断,条件满足了,函数返回真的话
//就退出迭代器的循环了
find_if(itertor beg,iterator end,_Pred);
//查找相邻重复元素,返回相邻位置第一个元素迭代器,找不到返回end迭代器
adjacent_find(itertor beg,iterator end);
//二分法查找,只能查找有序序列,返回值为true、false,查找自定义类型需要重载<
binary_search(itertor beg,iterator end,value);
//统计元素个数,返回int,查找自定义类型需要重载==,返回值为bool
count(itertor beg,iterator end,value)
//按条件统计元素个数,_Pred谓词提供按什么条件查找,谓词里满足条件返回真
//在谓词里传入自定义类型,并进行判断,就不用重载比较运算符了
count_if(itertor beg,iterator end,_Pred)
例子:
//自定义数据类型查找
class Car
{
public:
int age;
string name;
Car(int age,string name)
{
this->age=age;
this->name=name;
}
//重载==
bool operator==(const Car &c)
{
if(this->age==c.age&&this->name==c.name)
{
return true;
}else{return false;}
}
};
Car c1(1,"BWM");
Car c2(2,"BWM2");
Car c3(3,"BWM3");
vector<Car> vc;
vc.push_back(c1);
vc.push_back(c2);
vc.push_back(c3);
iterator<Car>::iterator it=find(vc.begin(),vc,end(),c1);
if(it==vc.end())
{cout<<"没找到"<<endl;}
else{cout<<"找到了"<<endl;}
排序算法
函数原型:
//排序,_Pred(谓词)可以不写,不写默认是升序,可以定制排序规则,指定谓词返回为真时就是排好的顺序
sort(itertor beg,iterator end,_Pred);
//指定范围内元素随机调整次序,加随机数种子,srand(unsigned int(time(NULL)));
random_shuffle(itertor beg,iterator end);
//容器元素合并,并且存储到另一容器,两个容器必须是有序的
//beg1.end1,beg2,end2容器1,2起始和结束迭代器,dest是目标容器迭代器,注意目标容器内存需要足够,否则需要先分配空间
//两个容器的顺序还应该一致,都是升序或都是降序
merge(itertor beg1,iterator end1,itertor beg2,iterator end2,iterator dest);
//反转
reverse(itertor beg,iterator end);
拷贝和替换算法
函数原型:
//容器内指定范围元素拷贝到另一容器
copy(itertor beg,iterator end,iterator dest);
//容器内指定范围所有旧的元素替换为新元素
replace(itertor beg,iterator end,old_value,new_value);
//容器内指定范围内满足条件的元素替换为新元素,_Pred(谓词)指定满足的条件
replace_if(itertor beg,iterator end,_Pred,new_value);
//交换两个容器内的元素,容器必须是同类型的
swap(container c1,container c2);
算术生成算法
属于小型算法需要包含头文件 #include< numeric >
函数原型:
//计算区间内元素累加总和,value是起始的累加值
accumulate(itertor beg,iterator end,value);
//指定区间内填充元素,其实就是替换区间内元素
fill(itertor beg,iterator end,value);
集合算法
函数原型:
//两个集合的交集,返回值是dest容器中交集元素的最后位置下一个元素的迭代器
set_intersection(itertor beg1,iterator end1,itertor beg2,iterator end2,iterator dest);
//两个集合的并集,两个容器必须是有序的
set_union(itertor beg1,iterator end1,itertor beg2,iterator end2,iterator dest);
//两个集合的差集
//需要注意1容器和2容器的差集与2容器和1容器的差集是不一样的
//前者是1容器减去交集部分,后者是2容器减去交集部分
set_difference(itertor beg1,iterator end1,itertor beg2,iterator end2,iterator dest);