«

4 STL-函数对象

时间:2023-10-31 00:17     作者:wen     分类: C++


[toc]

STL-函数对象

函数对象

函数对象概念

概念:

本质:

函数对象使用

特点:

示例:

#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <map>;

//函数对象(仿函数)
class MyAdd
{
public:
    int operator()(int v1, int v2)
    {
        return v1 + v2;
    }
};
//函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值。
void testA()
{
    MyAdd myAdd;
    cout << myAdd(10, 20) << endl;
}

class MyPrint
{
public:
    MyPrint()
    {
        this->count = 0;
    }

    void operator()(string test)
    {
        cout << test << endl;
        this->count++;
    }

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

//函数对象超出普通函数的概念,函数对象可以有自己的状态。
void testB()
{
    MyPrint myPrint;
    myPrint("hello world");
    myPrint("hello world");
    myPrint("hello world");
    myPrint("hello world");
    cout << myPrint.count << endl;
}

//函数对象可以作为参数传递。
void doPrint(MyPrint& myPrint, string test)
{
    myPrint(test);
}
void testC()
{
    MyPrint myPrint;
    doPrint(myPrint, "hello C++");
}

int main()
{
    //testA();
    //testB();
    testC();

    return 0;
}


谓词

谓词概念

概念:

一元谓词

示例:

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

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

void testA()
{
    vector<int> v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }
    //查找容器中 有没有大于5的数字
    //GreaterFive()匿名的函数对象
    vector<int>::iterator pos = find_if(v.begin(), v.end(), GreaterFive());
    if (pos != v.end())
    {
        cout << "大于5的数字: " << *pos << endl;
    }
    else {
        cout << "没找到" << endl;
    }
}

int main()
{
    testA();

    return 0;
}

二元谓词

示例:

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

class MyCompare
{
public:
    bool operator()(int v1,int v2)
    {
        return v1 > v2;
    }
};

void testA()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(30);
    v.push_back(50);
    v.push_back(20);
    v.push_back(40);
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
    sort(v.begin(), v.end(),MyCompare());

    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

int main()
{
    testA();

    return 0;
}

内建函数对象

内建函数对象意义

概念:

分类:

用法:


算术仿函数

功能描述:

仿函数原型:

示例:

#include <iostream>
using namespace std;
#include <string>
#include <functional>

//取反
void testA()
{
    negate<int> n;

    cout << n(50) << endl;

}
//加法
void testB()
{
    plus<int> p;
    cout << p(10, 20) << endl;
}

int main()
{
    testA();
    testB();
    return 0;
}


关系仿函数

功能描述:

仿函数原型:

示例:

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

void testA()
{
    vector<int> v;
    v.push_back(10);
    v.push_back(30);
    v.push_back(40);
    v.push_back(20);
    v.push_back(50);
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
    //大于 greater<int>()内建函数
    sort(v.begin(), v.end(), greater<int>());
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

int main()
{
    testA();
    return 0;
}


逻辑仿函数

功能描述:

函数原型:

示例:

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

//逻辑非
void testA()
{
    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 << " ";
    }
    cout << endl;
    //利用逻辑非,将容器v搬运到v2中,并执行取反操作
    vector<bool>v2;
    v2.resize(v.size());
    transform(v.begin(), v.end(),v2.begin(), logical_not<bool>());
    for (vector<bool>::iterator it = v2.begin(); it != v2.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

int main()
{
    testA();
    return 0;
}

标签: C/C++ c++提高编程