概述
- 算法主要是由头文件<algorithm>、<functional>、<numeric>组成
- <algotirhm>是所有STL文件中最大的一个,涉及比较、交换、查找、遍历、复制、修改等
- <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数
- <functional>定义了一些模板类,用以声明函数对象
常用遍历算法
- for_each(beg, end, func):遍历容器,beg、end为起始迭代器,func为函数或函数对象
- transform(beg1, end1, beg2, func):搬运容器到另一个容器中
常用查找算法
- find(beg, end, val):查找元素val,成功找到返回指定元素的迭代器,否则返回end()
//自定义数据类型的查找 class Person{ public: Person(string name, int age){ this.m_name = name; this.m_age = age; } //重载 == 让底层find知道如何对比Person数据类型 //如果不加const,会被系统认为非法,目的是防止数据被修改 bool operator==(const Person &p){ if(this->m_name == p.m_name && this.m_age == p.m_age){ return true; }else{ retrun false; } } string m_name; int m_age; } //重载后,find知道如何对比,可正常使用 //在v容器中寻找元素p vector<Person>::iteraor it == find(v.begin(), v.end(), p)
- find_if(beg, end, _Pred):按条件查找元素,Pred为谓词或仿函数
//自定义数据类型的按条件查找 //谓词 class Greater20{ public: bool operator()(cosnt Person &p){ return p.m_age > 20; } } //只需要将谓词传入find_if中 vector<Person>::iterator it = find_if(v.bedin(), v.end(), Greater20());
- adjacent_find(begin, end):查找相邻重复元素,返回相邻元素第一个位置的迭代器
- binary_search(beg, end, val):二分查找法,只能用于有序序列
- count(beg, end, val):统计值为val的元素个数
- count_if(beg, end, _Pred):按条件统计元素个数,_Pred为谓词
常用排序算法
- sort(beg, end, _Pred):对容器内的元素进行排序,可选参数 _Pred 为谓词
- random_shuffle(beg, end):洗牌,指定范围内的元素随机调整次序
- merge(beg1, end1, beg2, end2, dest):有序容器元素合并,并存储到另一容器dest保持有序
- reverge(beg, end):反转指定范围的元素
常用的拷贝和替换算法
- copy(beg, end, dest):容器指定范围内的元素拷贝到另一容器dest中
- replace(beg, end, oldvalue, newvalue):将容器范围内指定的旧元素修改为新元素
- replace_if(beg, end, _Pred, newvalue):容器内指定范围满足条件的元素替换为新元素
- swap(c1, c2):互换两个容器的元素
常用算术生成算法
- 算术生成算法属于小型算法,使用时包含的头文件为<numeric>
- accumulate(beg, end, val):计算容器元素累计总和,val为总和起始值,函数会返回累加总和
- fill(beg, end, val):向容器中添加元素val
常用集合算法
- set_intersection(beg1, end1, beg2, end2, dest):求两个有序容器的交集,返回交集中最后元素的迭代器
vector<int> vTarget; //取较小容器的空间值,开辟新空间 vTarget.resize(min(v1.size(),v2.size())); //返回目标容器的最后一个元素的迭代器地址 vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin()); //如果参数二输入vTarget.end(),可能会输出很多0,这些0并不是交集中的元素 for_each(vTarget.begin(), itEnd, myPrint());
- set_union(beg1, end1, beg2, end2, dest):求两个有序容器的并集,返回并集中最后元素的迭代器
vector<int> vTarget; //取容器空间值之和,开辟新空间 vTarget.resize(v1.size() + v2.size()); //返回目标容器的最后一个元素的迭代器地址 vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin()); //如果参数二输入vTarget.end(),可能会输出很多0,这些0并不是并集中的元素 for_each(vTarget.begin(), itEnd, myPrint());
- set_difference(beg1, end1, beg2, end2, dest):求两个容器的差集,返回差集中最后元素的迭代器,需要注意的是差集区分先后顺序,调换容器前后位置可能会得到不同结果