demo 二元函数对象
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
template <typename T>
class SumVector
{
public:
T operator()(T t1, T t2) // 二元函数对象
{
return t1 + t2;
}
protected:
private:
};
void play01()
{
vector<int> v1, v2, v3;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v2.push_back(2);
v2.push_back(4);
v2.push_back(6);
v3.resize(10);
transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), SumVector<int>());
/* transform函数原型
template<class _InIt1,
class _InIt2,
class _OutIt,
class _Fn2> inline
_OutIt transform(_InIt1 _First1, _InIt1 _Last1,
_InIt2 _First2, _OutIt _Dest, _Fn2 _Func)
{ // transform [_First1, _Last1) and [_First2, ...) with _Func
_DEBUG_RANGE(_First1, _Last1);
_DEBUG_POINTER(_Dest);
_DEBUG_POINTER(_Func);
if (_First1 != _Last1)
return (_Transform2(_Unchecked(_First1), _Unchecked(_Last1),
_First2, _Dest, _Func,
_Is_checked(_Dest)));
return (_Dest);
}
*/
// transform把运算结果迭代器的开始位置返回出来
for (vector<int>::iterator it = v3.begin(); it != v3.end(); ++it) {
cout << *it << ' ';
}
cout << endl;
// 3 7 11 0 0 0 0 0 0 0
}
int main()
{
play01();
return 0;
}
demo 二元谓词
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;
void printVector(vector<int> &v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
cout << *it << ' ';
}
cout << endl;
}
void FuncShowElemt2(const int &t)
{
cout << t << ' ';
}
// 二元谓词
bool myCompare(const int &a, const int &b)
{
return a < b;
}
void play01()
{
vector<int> v(10);
srand(time(0));
for (int i = 0; i < 10; i++) {
int tmp = rand() % 100;
v[i] = tmp;
}
printVector(v);
// 90 19 94 50 90 90 24 50 30 74
for_each(v.begin(), v.end(), FuncShowElemt2);
cout << endl;
// 90 19 94 50 90 90 24 50 30 74
sort(v.begin(), v.end(), myCompare);
for_each(v.begin(), v.end(), FuncShowElemt2);
cout << endl;
// 0 8 14 23 32 33 44 45 63 80
}
int main()
{
play01();
return 0;
}
demo 二元谓词在set中的应用
#include <iostream>
#include <cstdio>
#include <set>
#include <algorithm>
#include <string>
using namespace std;
struct CompareNoCase
{
bool operator()(const string &str1, const string &str2)
{
string tmpstr1;
tmpstr1.resize(str1.size());
transform(str1.begin(), str1.end(), tmpstr1.begin(), tolower);
string tmpstr2;
tmpstr2.resize(str2.size());
transform(str2.begin(), str2.end(), tmpstr2.begin(), tolower);
return tmpstr1 < tmpstr2;
}
};
void play01()
{
set<string> set1;
set1.insert("lucifer");
set1.insert("zhang");
set1.insert("yaoqi");
set<string>::iterator it1 = set1.find("LUcifer"); // find函数默认区分大小写
if (it1 == set1.end()) {
cout << "find fail\n";
}
else {
cout << "find success\n";
}
// find fail
set<string, CompareNoCase> set2;
set2.insert("lucifer");
set2.insert("zhang");
set2.insert("yaoqi");
set<string, CompareNoCase>::iterator it2 = set2.find("LUcifer"); // find函数默认区分大小写
if (it2 == set2.end()) {
cout << "find fail\n";
}
else {
cout << "find success\n";
}
// find success
}
int main()
{
play01();
return 0;
}