【嵌入式——C++】仿函数(STL)

【嵌入式——C++】 仿函数(STL)

  • 概念
  • 使用
  • 谓词
  • 内建函数对象
    • 算术仿函数
    • 关系仿函数
    • 逻辑仿函数

概念

重载函数调用操作符的类,其对象常称为函数对象,函数对象使用重载的()时,行为类似函数调用,也叫仿函数。仿函数是一个类,不是一个函数。

使用

仿函数在使用时,可以像普通函数那样使用,可以有参数,可以有返回值

class MyAdd {
public :
 int operator()(int v1, int v2) {
  return v1 + v2;
 }

};

void testMyAdd() {
 MyAdd myAdd;
 //int ret =myAdd(10,10) myAdd(10,10);
 cout << myAdd(10, 10) << endl;//20

}

仿函数超出普通函数的概念,仿函数可以有自己的状态

class MyPrint {
public:
 MyPrint() {
  this->count = 0;
 }
 void operator()(string text) {
  cout << text << endl;
  this->count++;
 }
 int count;//内部自己状态
};

void testMyPrint() {
 MyPrint myPrint;
 myPrint("hello world");//hello world
 myPrint("hello world");//hello world

 cout << "调用次数" << myPrint.count<<endl;//2
}

仿函数可以作为参数传递

void doPrint(MyPrint &mp,string text) {
 mp(text);
}

void testMyPrint() {
 MyPrint myPrint;
 myPrint("hello world");//hello world
 myPrint("hello world");//hello world

 cout << "调用次数" << myPrint.count<<endl;//2


 doPrint(myPrint,"doPrint");//doPrint
}

谓词

返回bool类型的仿函数称为谓词。
如果operator()接收一个参数,那么叫做一元谓词

//一元谓词
class GreaterFive {
public :
 bool operator()(int val) {
  return val > 5;
 }
};

void testGreaterFive() {

 vector<int>v;
 for (int i = 0; i < 10;i++) {
 
  v.push_back(i);
 }
 //查找容器有没有大于5的数字
 vector<int>::iterator it = find_if(v.begin(),v.end(), GreaterFive());
 if (it==v.end()) {
  cout << "未找到" << endl;
 }
 else {
  cout << *it << endl;//6
 }
}

如果operator()接收两个参数,那么叫做二元谓词

class MyCompare {
public :
 //重载小括号
 bool operator()(int v1,int v2) const
 {
  return v1 > v2;
 }

};

void test01() {
 vector<int>v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }
 //降序
 sort(v.begin(),v.end(), MyCompare());
 printVector(v);

}

内建函数对象

使用内建函数对象需要引入头文件 #include

算术仿函数

加法

plus<T>

void testNegate01() {
 plus<int> p;
 p(10,20);
 cout << p(10, 20) << endl; //30
}

减法

minus<T>

乘法

multiplies<T>

除法

divides<T>

取模

modulus<T>

取反

negate<T>

//取反 仿函数
void testNegate() {
 negate<int> n;
 n(50);//对50取反
 cout << n(50) << endl;//-50
}

关系仿函数

等于

bool equal_to<T>

不等于

bool not_equal_to<T>

大于

bool greater<T>

void testGreater() {
 vector<int> v;
 v.push_back(10);
 v.push_back(50);
 v.push_back(120);
 v.push_back(140);
 printVector(v);
 //降序
 sort(v.begin(), v.end(), greater<int>());
 printVector(v);
}

大于等于

bool greater_equal<T>

小于

bool less<T>

小于等于

bool less_equal<T>

逻辑仿函数

逻辑与

bool logical_and<T>

逻辑或

bool logical_or<T>

逻辑非

bool logical_not<T>

void testLogical() {
 
 vector<bool> v;
 v.push_back(true);
 v.push_back(false);
 v.push_back(true);
 v.push_back(false);
 for (vector<bool>::iterator it = v.begin(); it != v.end(); it++) {
  cout << *it << " "; //1 0 1 0
 }
 cout << endl;

 vector<bool> v2;
 //目标容器需要先开辟空间
 v2.resize(v.size());
 //v容器中的数据放到v2中 并取反
 transform(v.begin(),v.end(),v2.begin(),logical_not<bool>());

 for (vector<bool>::iterator it = v2.begin(); it != v2.end(); it++) {
  cout << *it << " "; //0 1 0 1
 }
 cout << endl;
}

你可能感兴趣的:(c++,开发语言,qt,物联网)