您的位置:首页 > 编程语言 > C语言/C++

c++之STL(9)重载函数调用操作符 函数对象 谓词

2016-07-28 08:45 561 查看
重载函数调用操作符

函数对象:定义了调用操作符的类,其对象称为“函数对象”

如果函数对象的返回值是bool 类型的,那么我们就称为它为谓词

一元函数对象 :函数返回一个值

一元谓词 :若返回值有一个对象,并且为bool类型的,

二元函数:对象函数对象有两个参数

二元谓词:函数返回为bool

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

using namespace std;

//class absInt{
//
//public:
//	int operator()(int val){
//
//	}
//};

// struct 里默认是公用的
struct absInt{
// 重载操作符:函数调用操作符
int operator()(int val){
return val < 0 ? -val : val;
}
};

// 普通函数
template<typename elementType>
void FuncDisplayElement(const elementType &element)
{
cout << element << endl;
};

// 函数对象 类是有数据成员的,那么就可以保持状态
template<typename elementType>
struct DisplayElement
{
void operator()(const elementType &element) const
{
cout << element << endl;
}
};

int main()
{
int i = -42;
absInt absObj;
unsigned int ui = absObj(i);
cout << ui << endl;
cout << "Hello 函数对象!" << endl;

vector<int> a;
for (int i = 0; i < 10; i++)
{
a.push_back(i);
}
list<char> b;
for (char c = 'a'; c < 'k'; ++c)
{
b.push_back(c);
}

// STL算法
for_each(a.begin(), a.end(), DisplayElement<int>());
cout << endl;
for_each(b.begin(), b.end(), DisplayElement<char>());
cout << endl;
//
system("pause");
return 0;
}
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

// 函数对象
template<typename numberType>
struct  IsMutiple// 默认是公认的
{
numberType m_Divisor;
IsMutiple(const numberType &divisor)
{
m_Divisor = divisor;
}
bool operator()(const numberType &element)const
{
return((element % m_Divisor) == 0);
}
};

int main()
{
IsMutiple<int> a(4);

vector<int> vecIntergers;
for (int i = 25; i < 100; i++)
{
vecIntergers.push_back(i);
}
vector<int>::iterator iElement;
iElement = find_if(vecIntergers.begin(), vecIntergers.end(), a);
if (iElement != vecIntergers.end())
{
cout << "第一个4的整数倍的数是:" <<  *iElement<< endl;
}
//
system("pause");
return 0;
}


#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

// 函数对象 一元谓词
template<typename numberType>
struct  IsMutiple// 默认是公认的
{
numberType m_Divisor;
IsMutiple(const numberType &divisor)
{
m_Divisor = divisor;
}
bool operator()(const numberType &element)const
{
return((element % m_Divisor) == 0);
}
};

int main()
{
//IsMutiple<int> a(4);

vector<int> vecIntergers;
for (int i = 25; i < 100; i++)
{
vecIntergers.push_back(i);
}
vector<int>::iterator iElement;
iElement = find_if(vecIntergers.begin(), vecIntergers.end(), IsMutiple<int>(4));
if (iElement != vecIntergers.end())
{
cout << "第一个4的整数倍的数是:" <<  *iElement<< endl;
}
//
system("pause");
return 0;
}


二元函数对象和二元谓词

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

//二元函数对象  这个不是谓词,只有返回值是bool,才被称为谓词
template<typename elementType>
class CMultiply
{
public:
elementType operator()(const elementType &elem1, const elementType &elem2)
{
return elem1 * elem2;
}
};

int main()
{
vector<int> a, b;
for (int i = 0; i < 10; i++)
a.push_back(i);
for (int j = 100; j < 110; j++)
b.push_back(j);

vector<int> vecResult;
vecResult.resize(10);	// 设置大小10个
// STL 算法
transform(a.begin(), a.end(), b.begin(), vecResult.begin(), CMultiply<int>());

// 对向量进行循环
for (size_t nIndex = 0; nIndex < vecResult.size(); nIndex++)
{
cout << vecResult[nIndex] << endl;
}
//
system("pause");
return 0;
}
#include<iostream>
#include<set>
#include<string>
#include<algorithm>

using namespace std;

// 二元谓词 改变容器默认的行为
class CCompareStringNoCase
{
public:
bool operator()(const string & str1, const string &str2)const
{
string str1LowerCase;
str1LowerCase.resize(str1.size());
transform(str1.begin(), str1.end(), str1LowerCase.begin(), tolower);
//
string str2LowerCase;
str2LowerCase.resize(str2.size());
transform(str2.begin(), str2.end(), str2LowerCase.begin(), tolower);

return(str1LowerCase < str2LowerCase);
}
};

int main()
{
set<string> xm;
set<string, CCompareStringNoCase> names;// 不分大小写,自己定义的一个set 容器
names.insert("Tina");
names.insert("jim");
names.insert("Jack");
names.insert("Sam");
names.insert("hello");

set<string>::iterator iNameFound = names.find("jim");
if (iNameFound != names.end())
{
cout << "找到了:" << *iNameFound << endl;
}
else
{
cout << "" << endl;
}

//
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: