cpp的函数对象和谓词

本文介绍C++中函数对象的概念及其作为谓词的应用,通过实例演示了一元与二元谓词的具体实现方法,并展示了如何与STL算法相结合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cpp的函数对象和谓词

什么是函数对象

将函数对象作为谓词

如何使用函数对象实现一元和二元谓词

函数对象和谓词的定义

函数对象

用作函数的对象,实际上是指实现了operator的类的对象
函数和函数指针也是对象,但是只有实现了operator的类的对象才能保持状态,才能用于STL算法

一元函数

接受一个参数的函数

一元谓词

接受一个参数的函数,而且返回bool类型i

二元函数

接受二个参数的函数

二元谓词

接受二个参数的函数,而且返回bool类型

他们和stl算法结合比较紧密。

看看我写的例子

//
//  main.cpp
//  use_functional_predicate
//
//  Created by bikang on 16/10/31.
//  Copyright (c) 2016年 bikang. All rights reserved.
//

#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;

template <typename T>
class FuncOneElem {
public:
    void operator()(const T & elem) const{
        cout << elem <<" ";
    }
};

template <typename T>
struct FuncOneElemBool {

    T div;
    FuncOneElemBool(const T &idiv){
        div = idiv;
    }
    bool operator()(const T & elem) const{
        return elem%div ==0;
    }
};

template <typename T>
class MyMuti{
public:
    T operator()(const T &e1 ,const T &e2){
        return (e1 * e2);
    }
};

class MyCompareStringNoCase{

public:

    bool operator()(const string str1,const string str2){

        string str1low;
        str1low.resize(str1.size());
        transform(str1.begin(), str1.end(), str1low.begin(), (int(*)(int))tolower);

        string str2low;
        str2low.resize(str2.size());
        transform(str2low.begin(), str2low.end(), str2low.begin(), (int(*)(int))tolower);

        return (str1low == str2low);
    }

};



//一元函数
void tfuncOne();
//一元谓词
void tfuncOneBool();

//二元函数
void tfuncTwo();

//二元谓词
void tfuncTwoBool();


int main(int argc, const char * argv[]) {
    //tfuncOne();
    //tfuncOneBool();
    //tfuncTwo();
    tfuncTwoBool();
    return 0;
}
void tfuncTwoBool(){
    cout << "tfuncTwoBool" << endl;



    //比较器
    typedef set<string,MyCompareStringNoCase> MYSET;
    MYSET ms1;
    ms1.insert("tom");
    ms1.insert("tim");
    ms1.insert("ted");

    MYSET::iterator itemFound;

    itemFound = ms1.find("kimadfd");
    cout << *itemFound << endl;
    if(itemFound != ms1.end()){
        cout << "find ok" << endl;
    }else{
        cout << "find faild" << endl;
    }

    itemFound = ms1.find("tim");
    cout << *itemFound << endl;
    if(itemFound != ms1.end()){
        cout << "find ok" << endl;
    }else{
        cout << "find faild" << endl;
    }


}

void tfuncTwo(){
    cout << "tfuncTwo" << endl;

    vector<int> vec1;
    for(int i=0;i<10;++i){
        vec1.push_back(i);
    }

    vector<int> vec2;
    for(int i=20;i<30;++i){
        vec2.push_back(i);
    }

    vector<int> res;
    res.resize(10);

    transform(vec1.begin(), vec1.end(), vec2.begin(), res.begin(), MyMuti<int>());

    //打印数据
    for_each(vec1.begin(), vec1.end(), FuncOneElem<int>());
    cout << endl;
    //打印数据
    for_each(vec2.begin(), vec2.end(), FuncOneElem<int>());
    cout << endl;
    //打印数据
    for_each(res.begin(), res.end(), FuncOneElem<int>());
    cout << endl;

}

void tfuncOneBool(){
    cout << "use function predicate" << endl;

    vector<int> vec1;
    for(int i=0;i<13;++i){
        vec1.push_back(i);
    }

    //持续查找
    vector<int>::iterator ielem,first;
    FuncOneElemBool<int> fone(5);

    first = vec1.begin();

    ielem = find_if(first, vec1.end(), fone);
    if(ielem != vec1.end()){
        cout << "first:" << *ielem << ",";
    }
    for_each(vec1.begin(), vec1.end(), FuncOneElem<int>());
    cout << endl;
    while (ielem != vec1.end()) {
        ielem = find_if(first, vec1.end(), fone);
        if(ielem != vec1.end()){
            cout << "first:" << *ielem << ",";
        }
        first = ielem+1;
    }

}

void tfuncOne(){
    cout << "use function one "<<endl;

    vector<int> vec1;
    for(int i=0;i<10;i++){
        vec1.push_back(i);
    }

    list<char> list1;
    for(char aChar='a';aChar<'m';aChar++){
        list1.push_back(aChar);
    }

    //打印数据
    for_each(vec1.begin(), vec1.end(), FuncOneElem<int>());
    cout << endl;
    for_each(list1.begin(), list1.end(), FuncOneElem<char>());
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值