欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第四十六节 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
相关标签: 函数对象