文章目录
- 一、C++的一些思考记录
- 1)C++函数进化(函数->函数指针->函数模板->仿函数|函数对象->lambda表达式)
一、C++的一些思考记录
1)C++函数进化(函数->函数指针->函数模板->仿函数|函数对象->lambda表达式)
①简单的比较函数
#include <iostream>int countMatchElements(int* beg,int* end)
{int result = 0;for(;beg!=end;++beg){if(*beg > 20) ++result;}return result;
}int main()
{int intArray[]= { 11,16,21,19,17,30 };//统计大于20的元素数量std::cout<< countMatchElements(intArray,intArray+6) <<std::endl;return 0;
}
②加入函数指针的优化(改变:传入不同的函数)
#include <iostream>int countMatchElements(int* beg,int* end,bool(*pred)(const int&))
{int result = 0;for(;beg!=end;++beg){if(pred(*beg)) ++result;}return result;
}//实际比较函数
bool isGreater20(const int &val) {return val > 20};
bool isGreater25(const int &val) {return val > 25};
bool isLess10(const int &val) {return val < 10};int main()
{int intArray[]= { 11,16,21,19,17,30 };//优化后的函数(用了函数指针)std::cout<< countMatchElements(intArray,intArray+6,isGreater20) <<std::endl;return 0;
}
③函数模板进一步优化(改变:传入的函数参数为不同类型)
#include <iostream>
template<typename T>
int countMatchElements(T* beg,T* end,bool(*pred)(const T&))
{int result = 0;for(;beg!=end;++beg){if(pred(*beg)) ++result;}return result;
}//实际比较函数
bool isGreater20(const int &val) {return val > 20;}
bool isGreater25(const int &val) {return val > 25;}
bool isLess10(const int &val) {return val < 10;}bool isTinyStr(const stdLLstring &val) {return val.size() <=3;}int main()
{int intArray[]= { 11,16,21,19,17,30 };//优化后的函数(用了函数指针)std::cout<< countMatchElements(intArray,intArray+6,isGreater20) <<std::endl;return 0;
}
④用仿函数进一步优化(改变:传入的函数参数为不同值,之前无论是模板还是函数指针都是写死的)
#include <iostream>
template<typename T,typename Pred>
int countMatchElements(T* beg,T* end,Pred pred)
{int result = 0;for(;beg!=end;++beg){if(pred(*beg)) ++result;}return result;
}//仿函数
template<typename T>
struct Greater{T mVal;////explicit只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示explicit Greater(T value):mVal(value) {} //构造函数初始化mValbool operator() (const T& val) const { return val > mVal;}//重载函数调用运算符
};int main()
{int intArray[]= { 11,16,21,19,17,30 };//阈值设置为20Greater<int> greater20{20};//不过仿函数无法给函数指针赋值//优化后的函数(用了函数指针)std::cout<< countMatchElements(intArray,intArray+6,greater20) <<std::endl;return 0;
}
⑤仿函数代码难以阅读,可以用lambda表达式改造下
#include <iostream>
template<typename T,typename Pred>
int countMatchElements(T* beg,T* end,Pred pred)
{int result = 0;for(;beg!=end;++beg){if(pred(*beg)) ++result;}return result;
}//仿函数
template<typename T>
struct Greater{T mVal;////explicit只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示explicit Greater(T value):mVal(value) {} //构造函数初始化mValbool operator() (const T& val) const { return val > mVal;}//重载函数调用运算符
};int main()
{int intArray[]= { 11,16,21,19,17,30 };//阈值设置为20//Greater<int> greater20{20};//不过仿函数无法给函数指针赋值auto greater20 = [](auto &val)->bool {return val>20;};//优化后的函数(用了函数指针)std::cout<< countMatchElements(intArray,intArray+6,greater20) <<std::endl;return 0;
}