概述:
算法主要由头文件<algorithm><functional><numeric>组成。
* <algorithm>是所有STL头文件中最大的一个,范围涉及到比较,交换,查找,遍历操作,复制,修改等等
* <numeric>体积很小,只包括几个序列上面进行简单数学运算的模板函数
* <functional>定义了一些模板类,用以声明函数对象。
掌握常用的遍历算法
for_each 遍历容器
函数原型:for_each(iterator beg,iterator end,_func);
_func函数或者函数对象
总结:for_each是实际开发中最常用的 必须要熟练掌握!
transform遍历容器
搬运容器到另外一个容器中
总结:搬运目标容器需要提前开辟空间,否则无法开辟!
常见查找算法
find //查找元素
find_if //按条件查找元素
adjacent_find //查找相邻重复元素
binary_search //二分查找法
count //统计元素个数
count_if //按条件统计元素个数
常用查找算法 find:
功能描述:
* 查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()
* 函数原型:
* find(iterator beg,iterator end,value);
* //按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
* beg 开始迭代器
* end结束迭代器
* value查找的元素
常用查找算法-find_if
功能描述:按条件查找元素
* 函数原型:find_if(iterator beg,iterator end,_pred);
* //按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
* //_pred 函数或者谓词(返回bool类型的仿函数)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*find_if
* 功能描述:按条件查找元素
* 函数原型:find_if(iterator beg,iterator end,_pred);
* //按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
* //_pred 函数或者谓词(返回bool类型的仿函数)*/
//内置数据类型查找
//普通函数
bool print(int val) {
return val>5;}
void test01() {
vector<int> v;
for (int i = 0;i<=6;i++) {
v.push_back(i);
}
vector<int>::iterator pos = find_if(v.begin(),v.end(),print);
if (pos != v.end()) {
cout << "找到了 " << *pos << endl;
}
else cout<<"没有找到!" << endl;
}
//自定义数据类型查找
class person {
public:
person(string name, int age) {
m_name = name;
m_age = age;
}
//重载:
bool operator==(const person& p){
if (p.m_age == this->m_age && p.m_name == this->m_name)
return true;
else return false;
}
bool operator()(person& p) {
return p.m_age > 18;
}
string m_name;
int m_age;
};
class Myprint {
public:
bool operator()(person &p) {
return p.m_age >18;
}
};
void test02() {
vector<person> v1;
person p1("1",18);
person p2("2", 16);
person p3("1", 19);
v1.push_back(p1);
v1.push_back(p2);
v1.push_back(p3);
vector<person>::iterator pos = find_if(v1.begin(), v1.end(),Myprint());
if (pos != v1.end()) {
cout << "找到了 " << endl;
}
else cout << "没有找到!" << endl;
}
int main() {
//test01();
test02();
return 0;
}
常用查找算法-adjacent_find
功能描述:
* 查找相邻重复元素
* 函数原型:
* adjacent_find(iterator beg,iterator end);
* 查找相邻重复元素,返回相邻元素的第一个位置的迭代器
* beg开始迭代器
* end结束迭代器
总结:面试题中如果出现查找相邻重复元素,记得用STL中的adjacent_find算法
常用查找算法-binary_search
功能描述:
* 查找指定元素是否存在
* 函数原型:bool binary_search(iterator beg,iterator end,value);
* //查找指定的元素,查到返回true 否则false
* //注意:在无序序列中不可用
beg 开始迭代器
end结束迭代器
value 查找的元素
总结:注意:在无序序列中不可用
常用查找算法- count
功能描述:统计元素个数
* 函数原型:count(iterator beg,iterator end,value);
统计元素出现次数
beg开始迭代器
end结束迭代器
value统计的元素
总结:统计自定义数据类型时候,需要配合重载operator==
总结:统计自定义数据类型时候,需要配合重载operator==
常用查找算法count_if
* 功能描述:按条件统计元素个数
* 函数原型:count_if(iterator beg,iterator end, _pred);
按条件统计元素出现次数
beg开始迭代器
end结束迭代器
_pred 谓词
常用排序算法
学习目标:掌握常用的排序算法
* 算法简介:
* sort();对容器内元素进行排序
* random_shuffle 洗牌 指定范围内的元素随机调整次序
* merge 容器元素合并,并存储到另外一个容器中
* reverse 反转指定范围的元素
常用排序算法-sort
功能描述:
* 对容器内元素进行排序
* 函数原型:
* sort(iterator beg,iterator end,_pred);
* 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
* beg 开始迭代器
* end 结束迭代器
* _pred 谓词
总结:sort算法是开发中常用的,需熟练掌握。
常用排序算法—random_shuffle
* 功能描述:洗牌 指定范围内的元素随机调整次序
* 函数原型:random_shuffle(iterator beg,iterator end);
* 指定范围内的元素随机调整次序
总结:这个算法非常实用,用之前记得加时间种子!
常用排序算法—merge
功能描述:两个容器元素合并,并存储到另外一个容器中
函数原型:merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
容器元素合并,并存储到另外一个容器中
注意:两个容器必须是有序的
dest开始目标迭代器
总结:注意:两个容器必须是有序的,并且目标容器需要提前分配空间!
常用排序算法—reverse
功能描述:将容器内元素进行反转
函数原型:reverse(iterator beg,iterator end);
反转指定范围的元素
总结:比较常用,面试题可能会遇到。
常用的拷贝和替换算法
学习目标:掌握常用的拷贝和替换算法
* 算法简介:copy //容器内指定范围的元素拷贝到另外容器中
* replace 将容器内指定范围的旧元素修改为新元素
* replace_if 容器内指定范围满足条件的元素替换为新元素
* swap 互换两个容器的元素
常用拷贝迭代器和替换算法copy
功能描述;容器内指定范围的元素拷贝到另外一个容器中
* 函数原型:
* copy(iterator beg,iterator end,iterator dest);
* 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
总结:利用copy算法在拷贝的时候,目标容器记得提前开辟空间!
常用拷贝迭代器和替换算法replace
功能描述:将容器内指定范围的旧元素修改为新元素
* 函数原型:
* replace(iterator beg,iterator end,oldvalue,newvalue);
* 将区间内旧元素替换成新元素
* beg开始迭代器
* end结束迭代器
* oldvalue旧元素
* newvalue新元素
总结:replace会替换区间内满足条件的元素
常用拷贝迭代器和替换算法replace_if
* 功能描述:将区间内满足条件的元素,替换成指定元素
* 函数原型:replace_if(iterator beg,iterator end,_pred,newvalue);
_pred 谓词
newvalue替换的新元素
总结:replace_if按条件查找,可以利用谓词仿函数灵活筛选满足的条件
常用拷贝迭代器和替换算法swap
功能描述:互换两个容器的元素
函数原型:swap(container c1,container c2);
互换两个容器的元素
c1容器1
c2容器2
总结:互换的两个容器必须同类型容器,且数据类型要相同!
常用算术生成算法-accumulate
* 功能描述:计算区间内容器元素累计总和
* 函数原型:
* accumulate(iterator beg,iterator end,value);
* 计算容器元素累计总和
* value起始值
总结:accumulate使用时头文件注意是numeric,这个算法很使用。
常用算术生成算法—fill
* 功能描述:
* 向容器中填充指定的元素
* 函数原型:fill(iterator beg,iterator end,value);
向容器中填充元素
value 填充的值
利用fill可以将容器区间内元素填充为指定的值
总结:利用fill可以将容器区间内元素填充为指定的值。
常用集合算法概念:
学习目标:掌握常用的集合算法
* 算法简介:
set_intersection 求两个容器的交集
* set_union 求两个容器的并集
* set_difference 求两个容器的差集
常用集合算法—set_intersection
* 功能描述:求两个容器的交集
函数原型:set_intersection(iterator beg1,interator end1,iterator beg2,iterator end2,iterator dest);
求两个集合的交集
注意:两个集合必须是有序序列
beg1容器1开始迭代器
end1容器1结束迭代器
beg2容器2开始迭代器
end2容器2结束迭代器
dest 目标容器开始迭代器
函数返回的是交集结束迭代器位置
总结:注意:两个集合必须是有序序列,开辟目标容器时选两个容器中最小值,set_intersection()函数返回的是交集结束迭代器位置.
常用集合算法—set_union
* 功能描述:求两个集合的并集
* 函数原型:set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
求两个集合的并集
注意:两个集合必须是有序序列
dest目标容器开始迭代器
总结:求并集的两个集合必须是有序序列
目标容器开辟空间需要两个容器相加
set_union返回值即是并集中最后一个元素的位置。
常用集合算法—set_difference
函数原型:set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)
* 求两个集合的差集
* 总结:求差集的两个集合必须是有序序列
* 目标容器开辟空间需要从两个容器中取较大者
* set_differenece返回值是差值中最后一个元素的位置