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
- cpp的函数对象和谓词
- 函数对象和谓词
- NDK-CPP语言-函数对象+谓词+函数绑定
- 二元函数对象和二元谓词
- 36STL之函数对象和谓词
- STL之函数对象和谓词
- STL之函数对象和谓词
- 谓词函数、函数对象
- 函数对象 谓词
- C++函数对象-谓词
- STL学习之十二:函数对象和谓词
- 一元函数对象和一元谓词
- 函数对象 谓词函数 函数适配器
- iOS开发之谓词Predicate和对象数组的排序
- C++STL之函数对象及谓词
- C++STL之函数对象及谓词
- C++STL之函数对象及谓词
- C++STL之函数对象及谓词
- Log Aggregator 비교 - Scribe, Flume, Fluentd, logstash
- Django下测试与调试REST API的方法
- python核心编程-第12章课后练习答案
- Ubuntu 16.04与Windows 10优缺点对比,个人理解
- 关于金融类数据运算的技术总结
- cpp的函数对象和谓词
- 高斯函数
- 简单字符串匹配
- json-c的树型封装(json-tree)
- 多行文本溢出显示省略号(…)全攻略
- sql聚集索引深入浅出讲解
- (1)行列式的定义
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 4(PL/SQL语言概览)
- 算法题:Patterns and Pictures