C++泛型算法和绑定器
1、C++泛型算法
#include <algorithm>//包含了C++ STL里面的泛型算法
泛型算法 = template + 迭代器 + 函数对象
特点一: 泛型算法的参数接收的都是迭代器(因为泛型算法是给所有容器都可以应用的,所以要有特定统一的方式,把所有容器类型元素遍历,所以是迭代器)
特点二: 泛型算法的参数还可以接收函数对象(C函数指针)
sort,find,find_if,binary_search,for_each 所有容器都可以使用
2、绑定器
绑定器 + 二元函数对象 =》 一元函数对象
bind1st: 把二元函数对象的operator()(a, b)的第一个形参绑定起来(把第1个参数绑定成固定的值,只需要外面传1个参数)
bind2nd: 把二元函数对象的operator()(a, b)的第二个形参绑定起来(把第2个参数绑定成已知固定值,只需要外面传第一个参数)
greater和less都是二元函数对象,每次都会取两个函数对象进行比较!
举例
#include <iostream>
#include <vector>
#include <algorithm>//包含了C++ STL里面的泛型算法
#include <functional>//包含了函数对象和绑定器
using namespace std;
int main()
{
int arr[] = { 12,4,78,9,21,43,56,52,42,31 };
vector<int> vec(arr, arr + sizeof(arr) / sizeof(arr[0]));
for (int v : vec)
{
cout << v << " ";
}
cout << endl;
//默认小到大的排序
sort(vec.begin(), vec.end());//底层是快排
for (int v : vec)
{
cout << v << " ";
}
cout << endl;
//有序容器中进行二分查找,效率高 O(logn)
if (binary_search(vec.begin(), vec.end(), 21))
{
cout << "binary_search 存在" << endl;
}
auto it1 = find(vec.begin(), vec.end(), 21);//从第0个元素一个一个下去找,O(n)
if (it1 != vec.end())
{
cout << "find 21存在" << endl;
}
//传入函数对象greater,改变容器元素排序时的比较方式
sort(vec.begin(), vec.end(), greater<int>());
for (int v : vec)
{
cout << v << " ";
}
cout << endl;
//78 56 52 43 42 31 21 12 9 4
//把48按序插入到vector容器当中 找第一个小于48的数字
//find_if需要的是一个一元函数对象
//greater :a > b less :a < b(48)
auto it2 = find_if(vec.begin(), vec.end(),
//find_if是在容器中找第一个小于48的数字,一次从容器中取1个数字而已,需要一元函数对象
//bind1st(greater<int>(), 48)); 把第1个参数绑定成48
//bind2nd(less<int>(), 48)); 把第2个参数绑定成48
[](int val)->bool {return val < 48; });
//lambda表达式写法,find_if把遍历的元素传给val进行比较
vec.insert(it2, 48);
for (int v : vec)
{
cout << v << " ";
}
cout << endl;
//for_each可以遍历容器的区间的所有元素,把每个元素值传给函数对象比较
//可以自行添加合适的函数对象对容器的元素进行过滤
for_each(vec.begin(), vec.end(),
[](int val)->void
{
if (val % 2 == 0)
{
cout << val << " ";
}
});
cout << endl;
return 0;
}