<十>泛型算法和绑定器

泛型算法
头文件 包含了C++ STL里面的泛型算法

泛型算法=》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;
	 }
})

posted @ 2022-12-15 17:20  Hello_Bugs  阅读(31)  评论(0编辑  收藏  举报