一、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) {} //构造函数初始化mVal
	bool operator() (const T& val) const { return val > mVal;}//重载函数调用运算符
};


int main()
{
	int intArray[]= { 11,16,21,19,17,30  };
	//阈值设置为20
	Greater<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) {} //构造函数初始化mVal
	bool 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;
}
09-28 10:48