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>());
}