内建函数
一、内建函数对象的意义
分类
- 算术仿函数
- 关系仿函数
- 逻辑仿函数
必须包含<functional>
头文件
二、算术仿函数
功能描述
- 实现四则运算
- 其中
negate
是一元运算,其他是二元运算
仿函数原型
template<class T> T plus<T> //加法仿函数
template<class T> T minus<T> //减法仿函数
template<class T> T multiplies<T> //乘法仿函数
template<class T> T divides<T> //除法仿函数
template<class T> T modulus<T> //取模仿函数
template<class T> T negate<T> //取反仿函数
#include <iostream>
#include <functional>
using namespace std;
void test1()
{
negate<int> mni;//取反
cout << mni(50) << endl;
}
void test2()
{
plus<int> mpi;//返回值,两个参数的类型底层是写的相同的,所以只用写一个
cout << mpi(10, 50) << endl;
}
void test3()
{
divides<int> mpi;//返回值的类型是int,
cout << mpi(10, 3) << endl;//输出为3
}
int main()
{
test1();
test2();
test3();
system("pause");
}
三、关系仿函数
template<class T> bool equal_to<T> //等于
template<class T> bool not_equal_to<T> //不等于
template<class T> bool greater<T> //大于
template<class T> bool greater_equal<T> //大于等于
template<class T> bool less<T> //小于
template<class T> bool less_equal<T> //小于等于
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;
void myPrint(const int & elem)
{
cout << elem << endl;
}
void test1()
{
vector<int> mv;
mv.push_back(10);
mv.push_back(123);
mv.push_back(123);
mv.push_back(42);
mv.push_back(5);
for_each(mv.begin(), mv.end(), myPrint);
sort(mv.begin(), mv.end(), greater<int>());
for_each(mv.begin(), mv.end(), myPrint);
}
int main()
{
test1();
system("pause");
}
四、逻辑仿函数
template<class T> bool logical_and<T> //逻辑与
template<class T> bool logical_or<T> //逻辑或
template<class T> bool logical_not<T> //逻辑非
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
void myPrint(int elem)
{
cout << elem << endl;
}
logical_not<int> m1;
void mlogic_not(int & elem)
{
elem = m1(elem);
}
void test1()
{
vector<int> mv;
mv.push_back(1);
mv.push_back(0);
mv.push_back(0);
mv.push_back(1);
mv.push_back(5);
for_each(mv.begin(), mv.end(), myPrint);
for_each(mv.begin(), mv.end(), mlogic_not);
for_each(mv.begin(), mv.end(), myPrint);
}
int main()
{
test1();
system("pause");
}
\\结果
1 0 0 1 5
0 1 1 0 0