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

STL算法设计理念 - 二元函数,二元谓词以及在set中的应用的更多相关文章

  1. STL算法设计理念 - 函数适配器

    1)函数适配器的理论知识 2)常用函数函数适配器 标准库提供一组函数适配器,用来特殊化或者扩展一元和二元函数对象.常用适配器是: 1.绑定器(binder): binder通过把二元函数对象的一个实参 ...

  2. STL算法设计理念 - 谓词,一元谓词demo

    谓词: 一元函数对象:函数参数1个: 二元函数对象:函数参数2个: 一元谓词 函数参数1个,函数返回值是bool类型,可以作为一个判断式 谓词可以使一个仿函数,也可以是一个回调函数. demo 一元谓 ...

  3. STL算法设计理念 - 函数对象和函数对象当参数和返回值

    函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过"对象名+(参数列表)&qu ...

  4. STL算法设计理念 - 函数对象和函数对象当參数和返回值

    函数对象: 重载函数调用操作符的类.其对象常称为函数对象(function object),即它们是行为类似函数的对象. 一个类对象,表现出一个函数的特征,就是通过"对象名+(參数列表)&q ...

  5. STL算法设计理念 - 预定义函数对象

    预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象 1)使用预定义函数对象: #include <iostream> #include <cstdio> #i ...

  6. C++ STL算法系列1---count函数

    一.count函数 algorithm头文件定义了一个count的函数,其功能类似于find.这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果. 编写程序读取一系列int型数据,并将 ...

  7. C++ STL算法系列6---copy函数

    现在我们来看看变易算法.所谓变易算法(Mutating algorithms)就是一组能够修改容器元素数据的模板函数,可进行序列数据的复制,变换等. 我们现在来看看第一个变易算法:元素复制算法copy ...

  8. 【转】三十分钟学会STL算法

    转载自: http://net.pku.edu.cn/~yhf/UsingSTL.htm 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把 ...

  9. C++进阶 STL(2) 第二天 一元/二元函数对象、一元/二元谓词、stack容器、queue容器、list容器(双向链表)、set容器、对组、map容器

    01 上次课程回顾 昨天讲了三个容器 string  string是对char*进行的封装 vector 单口容器 动态数组 deque(双端队列) 函数对象/谓词: 一元函数对象: for_each ...

随机推荐

  1. [BBS]搭建开源论坛之JForum富文本编辑器更换

    本文作者:sushengmiyan  本文地址:http://blog.csdn.net/sushengmiyan/article/details/47866905 上一节我们将开发环境搭建完成,我们 ...

  2. 20160224.CCPP体系详解(0034天)

    程序片段(01):指针与结构体.c 内容概要:指针与结构体 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include < ...

  3. Texlive 更新命令

    设置repository tlmgr repository set http://mirror.hust.edu.cn/CTAN/systems/texlive/tlnet 上面的例子使用的是华中科技 ...

  4. REFRESH删除POSTGRESQL

    sudo apt-get install python-psycopg2sudo apt-get install postgresql sudo su - postgres createuser -- ...

  5. android的activity栈管理

    在进行BlackBerry程序开发的时候,BlackBerry提供了一个管理Screen的栈,用来从任何地方来关闭位于最上一层的Screen,使用UiApplication.getUiApplicat ...

  6. JBOSS EAP 6 系列四 EJB实现——调用(贯穿始终的模块)

    本文主要介绍在JBOSS EAP 6.2(或者JBOSS AS7)中模块是如何贯穿EJB实现的始终.延续上一博文<认识模块的使用>的话题继续聊JBOSS做为模块申明式容器的这一特性在EJB ...

  7. 移动开发测试工具——Bugtags的集成

    移动开发测试工具--Bugtags 官网:https://bugtags.com/ 注册开发者账号 注册账号并激活邮箱,都会就不多做介绍了. 创建应用 创建完账号以后会提示添加应用,点击添加 添加应用 ...

  8. 1.使用C++封装一个链表类LinkList

     使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸********** ...

  9. 最简单的视频编码器:基于libx264(编码YUV为H.264)

    ===================================================== 最简单的视频编码器系列文章列表: 最简单的视频编码器:编译 最简单的视频编码器:基于libx ...

  10. 步步为营---- MuleEsb学习(一) 扫盲篇

    本篇文章是基于不断的接触GXPT之后,对其技术开始不断的积累学习^^^,有很多问题带给我了思考,对于如何的处理各个部分的流程?这个如何处理?太多的问题促使着我一步一步的学习,在师哥们的指导下,逐步的清 ...