C++11中的仿函数:原理与实际应用探讨——第二部分:如何运用仿函数
最编程
2024-01-12 18:16:59
...
1.基本使用
首先看一下基本上都知道的算法函数for_each遍历容器,打印所有的数值
void fun(int i)
{
cout << i << endl;
}
int main(int argv, char* argc[])
{
vector<int> it = { 1,2,3,4, 6, 7, 8 };
for_each(it.begin(), it.end(), fun);
return 0;
}
如果是用仿函数,这个时候实际会创建一个临时的print对象,然后调用()方法
class print {
public:
print()
{
cout << "This is print" << endl;
}
public:
void operator()(int i)
{
cout << i << endl;
}
};
int main(int argv, char* argc[])
{
vector<int> it = { 1,2,3,4, 6, 7, 8 };
for_each(it.begin(), it.end(), print());
return 0;
}
输出结果:
不过这样看起来还不如不用仿函数,那么我们看下面一个例子
2.要求打出小于5的值
还是上面那个例子,不过现在新增要求,打印小于5的数值,这时候发现sor不容易传入接口
void fun(int i, int j)
{
if(i < j)
cout << i << endl;
}
这时,实际上有两种方法可以解决问题
1.利用bind绑定,这种用法请查看C++11特性bind,这里不做介绍
void fun(int i, int j)
{
if (i < j)
cout << i << endl;
}
int main(int argv, char* argc[])
{
vector<int> it = { 1,2,3,4, 6, 7, 8 };
for_each(it.begin(), it.end(), std::bind(fun, std::placeholders::_1, 5));
return 0;
}
2.利用仿函数
class print {
public:
print(int j) : m_j(j)
{
cout << "This is print" << endl;
}
public:
void operator()(int i)
{
if(i < m_j)
cout << i << endl;
}
public:
int m_j;
};
int main(int argv, char* argc[])
{
vector<int> it = { 1,2,3,4, 6, 7, 8 };
for_each(it.begin(), it.end(), print(5));
return 0;
}
3.结合模板使用
看到这里可能会说,仿函数一方面必须要在类里实现operator,一方面还可以被更简便的方法替代,那么为什么还要使用仿函数?
其实上文已经说了,仿函数是配合STL进行使用,用于方便模板类和模板函数。
还是上面那个例子,但是现在不确定vector存储的类型,也不确定所输出的条件。
class print {
public:
print(T j) : m_j(j) //模板类,不确定条件类型
{
cout << "This is print" << endl;
}
public:
void operator()(int i) //输出比j小的值
{
if(i < m_j)
cout << i << endl;
}
void operator()(string i) //打印字符串大小小于j的值
{
if (i.size() < m_j)
cout << i << endl;
}
void operator()(double i) //打印double比i小的值
{
if (i < m_j)
cout << i << endl;
}
public:
T m_j;
};
int main(int argv, char* argc[])
{
vector<int> it1 = { 1,2,3,4, 6, 7, 8 };
for_each(it1.begin(), it1.end(), print(5));
vector<string> it2 = { "123", "12345", "123436", "1343253245"};
for_each(it2.begin(), it2.end(), print(5));
vector<double> it3 = { 1.1, 2.3, 3.4, 4.7, 6.9, 7.1 };
for_each(it3.begin(), it3.end(), print(5.0));
return 0;
}