置顶推荐转载引用的博文(讲解的很详细):https://www.cnblogs.com/ne-liqian/p/7889631.html
泛型算法:
泛型算法是STL库里面定义的一些算法,这些算法可以用一个接口操作各种数据类型,因此成为泛型算法。
泛型算法只依赖于迭代器的操作,而不是依赖于容器。
头文件:#include <algorithm> 和 #include <numeric>。
常用泛型算法:
1、find(begin,end,value);
查找算法。begin到end是查找范围的迭代器,value是要找的值,返回值是第一个等于给定值的迭代器,找不到,则返回end。
int main()
{
int target = 1;
vector<int> vec;
int array[4] = {1,2,3,4};
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
if(find(vec.begin(), vec.end(), target) == vec.end())
printf("not find\n");
else
printf("find\n");
//查找一个数组
if(find(&array[0], &array[3], target) == &array[3])
printf("not find\n");
else
printf("find\n");
}
2、find_if(begin, end, pred)
find_if(begin, end, pred):查找算法。带自定义查找函数(第三个参数)。意思就是对begin到end上面每一个元素判断 pred (*iter) == true,则表示找到返回当前迭代器,找不到则返回end。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool isequal6(const int &v1)
{
return (v1 == 6);
}
class isequal5
{
public:
bool operator () (int& target)
{
return (target == 5);
}
};
class isequal
{
public:
isequal(int value):m_value(value){}
bool operator () (int& target)
{
return (target == m_value);
}
int m_value;
};
int main()
{
vector<int> vec1;
vec1.push_back(1);
vec1.push_back(5);
vec1.push_back(6);
使用自定义函数isequal6(参数时容器中使用迭代器遍历的每个元素)
if(find_if(vec1.begin(), vec1.end(), isequal6() != vec1.end()))
printf("find\n");
else
printf("not find.\n");
所谓的仿函数就是函数对象(类中有()运算符重载函数,此时该类定义的对象就可以当函数使用,函数使用的时候不就需要用()么)
if(find_if(vec1.begin(), vec1.end(), isequal5() != vec1.end())) //使用仿函数
printf("find\n");
else
printf("not find.\n");
if(find_if(vec1.begin(), vec1.end(), isequal(7) != vec1.end())) //使用带参数的构造函数仿函数
printf("find\n");
else
printf("not find.\n");
return 0;
}
仿函数(函数对象):上面代码中提及。怕你看不见标红了。
介绍find_if那就顺带介绍一下绑定器:bind1st 与 bind2nd
bind1st : 绑定二元函数对象operator()的第一个参数
bind2nd :绑定二元函数对象operator()的第二个参数
vector<int> vec = {1, 2, 2, 3, 4};
pos1 = find_if(vec.begin(), vec.end(), bind1st(less<int>(), 2));
cout << *pos1 << endl;
输出3 less<int>() 就是'<'二元操作 bind1st绑定第一个元素,可以理解为哦绑定在左边 2 < ?
该函数的意思就是查找第一个比2大的元素
pos2 = find_if(vec.begin(), vec.end(), bind2nd(greater<int>(), 2));
cout << *pos2 << endl;
输出3 greater<int>() 就是'>'二元操作 bind2nd绑定第二个元素,可以理解为哦绑定在右边 ? > 2
该函数的意思也是查找第一个比2大的元素
3、accumulate(begin,end,init_value)
求和算法。begin到end是求和范围的迭代器,init_value是求和的初值。意思就是求前面范围的和,最后加上init_value。
4、sort(begin,end)
排序算法。这个就是排序,另外可以有第三个参数,传入自定义的比较函数,另外也可以传入stl自带的比较函数模板。
把vec里面的元素按从大到小的序列进行排序
sort(vec.begin(), vec.end(), greater<int>());
默认排序方式:小到大
sort(vec.begin(), vec.end());
sort(vec.begin(), vec.end(),less<int>());
还有很多算法,这里就不一一介绍了。