Notas de estudio de C ++ STL (2)

Trivia:
 El último artículo es: C++ STL Learning (1) , si desea comprender la interfaz del contenedor y las similitudes y diferencias de cada contenedor, está en el último artículo.
 Este artículo se utiliza para documentar objetos de función.

4.1 Objetos de función STL

1. Características del concepto esencial

Naturaleza

 Un objeto de función (functor) es una clase, no una función

concepto

 La clase que sobrecarga el operador de llamada de función, su objeto a menudo se llama objeto de función.
 Cuando el objeto de función usa sobrecargado (), el tipo de comportamiento es llamada de función, también llamado funtor.

características

 Cuando se utiliza un objeto de función, se puede llamar como una función normal, puede tener parámetros y puede tener un valor de retorno. El concepto de objeto de función va más allá de una función normal   . El objeto de función puede tener
 su propio estado.

En segundo lugar, el uso de objetos funcionales.

#include <iostream>
#include<string>

using namespace std;

//1、函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
class MyAdd
{
    
    
public:
   int operator()(int v1, int v2)
   {
    
    
   	return v1 + v2;
   }
};

void test01()
{
    
    
   MyAdd myadd;
   cout << myadd(10, 10) << endl;
}

//2、函数对象超出普通函数的概念,函数对象可以有自己的状态
class MyPrint{
    
    
public:
   MyPrint(){
    
    
   	this->count = 0;
   }
   void operator()(string test){
    
    
   	cout << test << endl;
   	this->count++;
   }

   int count;	//内部自己的状态
};

void test02(){
    
    
   MyPrint myPrint;
   myPrint("hello world");
   myPrint("hello world");
   myPrint("hello world");
   cout << "myPrint调用次数为:" << myPrint.count << endl;
}

//3、函数对象可以作为参数传递
void doPrint(MyPrint& myPrint, string test){
    
    
   myPrint(test);
}

void test03(){
    
    
   MyPrint myPrint;
   doPrint(myPrint, "hello c++");
}


int main(){
    
    
   test01();
   test02();
   test03();
}

4.2 Predicados

concepto

Los functores que devuelven tipo bool se llaman predicados.
Si el operador() toma 1 parámetro, se llama predicado unario.
Si el operador() toma 2 parámetros, se llama predicado binario.

uso de predicados

predicado unario

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

class GreaterFive{
    
    
	public:
		bool operator()(int val){
    
    
			return val > 5;
		}
};

void test01(){
    
    
	vector<int>v;
	for(int i=0;i<10;i++){
    
    
		v.push_back(i);
	}
	
	//查找容器中有没有大于5的数字
	//GreaterFive() 匿名函数对象
	vector<int>::iterator it = find_if(v.begin(),v.end(),GreaterFive());
	if(it == v.end())
		cout<<"no number greater than five"<< endl;
	else
		cout<<*it<<endl;
}
int main(){
    
    
	test01();
	return 0;
} 

Uso de predicados binarios

#include <iostream>
#include<vector>
#include<algorithm>
 
using namespace std;
 
//2、二元谓词
class MyCompare
{
    
    
public:
	bool operator()(int v1, int v2){
    
    
		return v1 > v2;
	}
};
 
void test01(){
    
    
	vector<int> v;
	v.push_back(10);
	v.push_back(40);
	v.push_back(20);
	v.push_back(30);
	v.push_back(50);
	
	sort(v.begin(), v.end());
 
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++){
    
    
		cout << *it << " ";
	}
	cout << endl;
 
	//使用函数对象,改变算法策略,变为排序规则从大到小
	sort(v.begin(), v.end(), MyCompare());
 
	cout << "排序后" << endl;
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++){
    
    
		cout << *it << " ";
	}
	cout << endl;

}

int main(){
    
    
	test01();
}

4.3 Objetos de función incorporados

Concepto Clasificación Uso

concepto:

El STL tiene algunos objetos de función incorporados.

Clasificación:

Funtor aritmético
Funtor relacional
Funtor lógico

uso:

Los objetos generados por estos funtores se utilizan exactamente de la misma manera que las funciones generales.
Para utilizar objetos de función integrados, se requieren archivos de encabezado.#include <functional>

①Funtor aritmético

Función descriptiva:

Realizar operaciones como suma, resta, multiplicación, división y módulo.

Aviso:

Entre ellas, negar es una operación unaria y las demás son operaciones binarias.

Prototipo de funtor:

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>		//取反

ejemplo:

//一元运算 取反
negate<int>n;
cout << n(10) << endl;
//二元运算 加法 默认传的都是同类型
plus<int>m;
cout << m(10, 20) << endl;

②Funtor relacional

Función descriptiva:

 Realice una comparación de relaciones;
 debido a que es el valor predeterminado cuando se implementa la capa inferior de clasificación less<>, todo está ordenado en orden ascendente; necesitamos usar greater<>
 objetos anónimos de uso común

Prototipo de funtor:

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>	//小于等于

ejemplo:

//利用匿名对象 实现从大到小排列
sort(v.begin(),v.end(),greater<int>());

③ Funtor lógico

Función descriptiva:

 permitir la comparación relacional;

Prototipo de funtor:

template<class T> bool logical_and<T> //与
template<class T> bool logical_or<T>  //或
template<class T> bool logical_not<T> //非

ejemplo:

//利用匿名对象 实现取反
vector<bool>v;
v.push_back(true);
v.push_back(false);
v.push_back(true);
v.push_back(false);

vector<bool>v2;
v2.resize(v.size());

transform(v.begin(), v.end(), v2.begin(), logical_not<bool>());

Supongo que te gusta

Origin blog.csdn.net/Stanford_sun/article/details/122777188
Recomendado
Clasificación