第四十六节 C++ 函数对象 -用于STL的算法中
程序员文章站
2022-07-12 16:31:35
...
函数对象: 常用于标准模板库STL的算法
1. 定义上为函数的对象;
2. 实现上是实现了operator()的类的对象;
常用的函数对象可分为多种:
1 一元函数:输入为1个参数
2 二元函数:输入为2个参数
3 带变量的一元函数:输入为1个参数,且类内有属性成员
4 带变量的二元函数:输入为2个参数,且类内有属性成员
5 一元谓词:输入为1个参数,返回值为bool变量
6 一元谓词:输入为5个参数,返回值为bool变量
这里仅对一元函数,一元谓词,二元谓词进行举例。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
/*1 函数模板:为了打印不同类型的内容*/
template <typename T1>
void DisplayContent(const T1 input) {
int index = 0;
for (auto Iterator = input.begin(); Iterator != input.end(); ++Iterator) {
index = std::distance(input.begin(), Iterator);
cout << " [" << index << "] = ";
cout << *Iterator << endl;
}
cout << endl;
}
/*2 函数对象(实现operator()类的对象) - 一元函数*/
template <typename T>
class funObjOneVar {
public:
void operator () (const T& input ) const {
cout << input << " ";
}
};
/*3 函数对象- 一元谓词*/
template <typename T>
class funObjOneWord {
public:
int DIV;
funObjOneWord(int initDIV) : DIV(initDIV) {}
bool operator () (const T& input) { //1 实现operator(), 2 一个参数,3 返回bool
return ((input % DIV) == 0);
}
};
/*4 函数对象- 二元谓词*/
template <typename T>
class funObjTwoWord {
public:
bool operator () (const T& input1, const T& input2) {
return (input1 > input2);
}
};
int main()
{
std::vector <int> intVector;
for (int index = 0; index < 6; ++index) {
intVector.push_back(index);
}
/*使用函数对象-一元函数,用于STL算法for_each()*/
cout << "the original data:" << endl;
std::for_each(intVector.begin(), intVector.end(), funObjOneVar <int> ());
cout << endl;
/*使用函数对象- 一元谓词,用于STL算法find_if*/
int divInput = 2;
cout << "the value%2 == 0 data:" << endl;
auto Iterator = std::find_if(intVector.begin(), intVector.end(), funObjOneWord <int> (divInput));
if (Iterator != intVector.end())
cout << "value = " << *Iterator << endl;
cout << endl;
/*使用函数对象- 二元谓词,用于STL算法sort()排列顺序不考虑大小写*/
std::vector <char> charVector;
charVector.push_back('b');
charVector.push_back('A');
charVector.push_back('D');
charVector.push_back('e');
cout << "original char data:" << endl;
DisplayContent(charVector);
cout << "defalut sort():" << endl;
sort(charVector.begin(), charVector.end());
DisplayContent(charVector);
cout << "use funObjTwoWord re-sort():" << endl;
sort(charVector.begin(), charVector.end(), funObjTwoWord<char>());
DisplayContent(charVector);
return 0;
}
the original data:
0 1 2 3 4 5
the value%2 == 0 data:
value = 0
original char data:
[0] = b
[1] = A
[2] = D
[3] = e
defalut sort():
[0] = A
[1] = D
[2] = b
[3] = e
use funObjTwoWord re-sort():
[0] = e
[1] = b
[2] = D
[3] = A
上一篇: 【c++ STL】算法