[C ++] - objeto de función

1. El concepto de objetos de función.

Cuando se trata del concepto de objetos de función, todos pueden estar relativamente poco familiarizados. Primero, comencemos con los punteros de función en el lenguaje C familiar.
También implementamos la función de suma, una se implementa con un puntero de función en lenguaje C y la otra se implementa con un objeto en C ++, como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí
para ver qué es diferente, la implementación del lenguaje C a la izquierda es la función. La dirección y la siguiente forma de C ++ se pasan en el objeto de suma, cuyo objeto realiza la función llamando a la función de operador.
A partir de esto, puede dar un concepto concreto del objeto de función.
Los objetos con la función de sobrecarga del operador operator () paréntesis se denominan objetos de función o functores

Segundo, los beneficios de los objetos de función.

(1) Lograr comparar la versión uno:

template<typename T>
bool compare(T a, T b)
{
	return a > b;
}
int main()
{
	cout << compare(10, 20) << endl;
	cout << compare('b', 'y') << endl;
	return 0;
}

Mirando de cerca la implementación de la función anterior, podemos pensar en ello, ¿qué pasa si queremos implementar menos? No podemos realizar cambios frecuentes en las funciones de la biblioteca, por lo que esto lleva a la solución de los punteros de funciones del lenguaje c

(2) Utilice la solución de puntero de función c

template<typename T>
bool mygreater(T a, T b)
{
	return a > b;
}
template<typename T>
bool myless(T a, T b)
{
	return a < b;
}

template<typename T,typename Compare>
bool compare(T a, T b, Compare comp)
{
	return comp(a, b);
}
int main()
{
cout << compare(10, 20, mygreater<int>) << endl;
	cout << compare(10, 20, myless<int>) << endl;
	return 0;
}

El resultado de la ejecución es el siguiente:
Inserte la descripción de la imagen aquí
observe cuidadosamente la realización de la función anterior , no hay forma de alinear la llamada de función a través del puntero de función, la eficiencia es muy baja, debido a la sobrecarga de la llamada de función.
Aunque no es posible escribir la función que se llamará como una función en línea, porque el puntero de la función se llama en tiempo de ejecución, pero la función en línea debe expandirse en tiempo de compilación.
De esto, hemos derivado una solución del objeto de función

(3) Implementación de versión de objeto de función C ++

template<typename T>
class mygreater
{
public:
	bool operator()(T a, T b)
	{
		return a > b;
	}
};
template<typename T>
class myless
{
public:
	bool operator()(T a, T b)
	{
		return a < b;
	}
};
int main()
{
//此时传入的是两个对象而不是函数的地址
	cout << compare(10, 20, mygreater<int>()) << endl;
	cout << compare(10, 20, myless<int>()) << endl;
	return 0;
}

Beneficios función de objeto:
1 llamada por el operador objeto de función (), puede llamar a la función de sobrecarga omitido
que funcionan qué objeto es muy clara llamada del proceso de compilación, lo que hace objeto de la función de uso es completamente en línea , provincia Llamada de función eliminada sobrecarga

2. Debido a que el objeto de función es generado por una clase, puede agregar variables miembro relacionadas para registrar más información cuando se utiliza el objeto de función.
Por ejemplo, si desea registrar cuántas veces se ha llamado a este objeto, puede definir un recuento variable de miembro de recuento en el miembro privado

Tercero, la aplicación de objetos de función.

Aplicación 1: cola prioritaria

En la cola de prioridad, el valor predeterminado es el montón de raíz grande, pero podemos cambiar el método de comparación subyacente para lograr el montón de raíz pequeña, el código es el siguiente:

int main()
{
	priority_queue<int> que1;//默认的是大根堆
	for (int i = 0; i < 10; i++)
	{
		que1.push(rand() % 100);
	}
	while (!que1.empty())
	{
		cout << que1.top() << " ";
		que1.pop();
	}
	cout << endl;

	//小根堆 改变底层比较的方式
	using MinHeap = priority_queue<int, vector<int>, greater<int>>;
	MinHeap que2;
	for (int i = 0; i < 10; i++)
	{
		que2.push(rand() % 100);
	}
	while (!que2.empty())
	{
		cout << que2.top() << " ";
		que2.pop();
	}
	cout << endl;
	return 0;
}

Aplicación dos: set
es el valor predeterminado del sistema en set es menor, implementemos el arreglo de grande a pequeño

int main()
{
	set<int,greater<int>> set1;
	for (int i = 0; i < 10; i++)
	{
		set1.insert(rand() % 100);
	}
	for (int v : set1)
	{
		cout << v << " ";
	}
	cout << endl;
	return 0;
}
Publicado 98 artículos originales · ganado elogios 9 · vistas 3657

Supongo que te gusta

Origin blog.csdn.net/qq_43412060/article/details/105298230
Recomendado
Clasificación