<十>泛型算法和绑定器
泛型算法
头文件
泛型算法=》template + 迭代器 + 函数对象
sort, find , find_if , binary_search , for_each
泛型算法特点
1:泛型算法的参数接收的都是迭代器(迭代器保证了接口统一)
2:泛型算法的参数还可以接收函数对象
int arr[]={12,34,11,23,56,33,6,88};
vector<int> vec(arr,arr+sizeof(arr)/sizeof(arr[0]));
for(int v : vec){
cout<< v <<" ";
}
cout<<endl;
sor(vec,vec.begin(),vec.end(),greater<int>());//排序 默认是less<T>()
//排序后,如果要查找,用二分查找,时间快 log2(N)
auto it1=binary_search(vec.begin(),vec.end(),21); //log2(N)
//find的效率没有binary_search效率高
auto it2=find(vec.begin(),vec.end(),21);
if(it2!=vec.end){
cout<<"找到了"<<endl;
}
//find_if需要的是1元函数对象,C++库提供的是二元函数对象
//所以就需要绑定器bind1st 绑定第一个参数,bind2st绑定第2个参数
//bind1st bind2st + 二元函数对象=>一元函数对象
//找到第一个小于20的元素位置
auto it3=find_if(vec.begin(),vec.end(),bind2st(less<int>(),20));
if(it3!=vec.end()){
cout<<"找到了"<<endl;
}
//也可以用lamda表达式
auto it4=find_if(vec.begin(),vec.end(),[](int val)->bool{reutrn val<20});
if(it4!=vec.end()){
cout<<"找到了"<<endl;
}
//for_each可以遍历容器的所有元素,可以自行添加合适的函数对象对容器进行过滤
//泛型可以避免多写一个只用一次的函数对象,精简项目混乱
for_each(vec.begin(),vec.end();[](int val)->void{
if(val%2==0){
cout<<val<<endl;
}
})