cpp的函数对象和谓词

来源:互联网 发布:词根词缀字典 知乎 编辑:程序博客网 时间:2024/06/08 03:16

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>());}
0 0
原创粉丝点击