关闭

STL算法设计理念 - 二元函数,二元谓词以及在set中的应用

标签: stl算法二元函数二元谓词谓词
1003人阅读 评论(0) 收藏 举报
分类:

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

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

谓词与lambda表达式

谓词 谓词是一个可调用的表达式,其返回结果是一个能用作条件的值,一般作为算法重载的参数使用。STL中所使用的谓词分为两类: 一元谓词:只接受一个函数; 二元谓词:可以接受两个参数。 接受谓词参...
  • u010275850
  • u010275850
  • 2015-11-16 15:11
  • 1598

STL中的set使用方法详细!!!!

1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数...
  • chaoyueziji123
  • chaoyueziji123
  • 2014-08-07 17:19
  • 3769

用python实现NLP中的二元语法模型

最近刚接触NLP,使用的书是宗成庆的《统计自然语言处理》,看到n元语法模型这一章节,于是用python写了出来。 而一切的起源,则是一个简单的问题。 1 基于以下语料建立语言模型 研究生物...
  • firparks
  • firparks
  • 2017-01-15 19:21
  • 1566

stl算法设计理念_一元函数对象和一元谓词

传智扫地僧课程学习笔记。 函数对象,一元谓词,这些才听,觉得有点陌生, 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(functionobject),即它们是行为类似函...
  • qq_18973645
  • qq_18973645
  • 2017-01-18 22:24
  • 201

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

1)函数适配器的理论知识 2)常用函数函数适配器 标准库提供一组函数适配器,用来特殊化或者扩展一元和二元函数对象。常用适配器是: 1、绑定器(binder):...
  • zyq522376829
  • zyq522376829
  • 2015-07-09 22:01
  • 590

stl算法设计理念:函数对象和函数对象当参数和返回值

结论:分清楚stl算法返回的值时迭代器还是谓词(函数对象)是stl算法入门的重点
  • patkritLee
  • patkritLee
  • 2016-03-19 13:31
  • 201

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

函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个...
  • zyq522376829
  • zyq522376829
  • 2015-07-09 13:39
  • 895

stl算法设计理念_预定义函数对象和函数适配器2_案例

传智扫地僧课程学习笔记。 多看老师代码,多敲老师代码, class IsGreat { public: IsGreat(int i) { m_num = i; } bool o...
  • qq_18973645
  • qq_18973645
  • 2017-01-19 02:13
  • 53

两种不同随机算法设计理念

随机算法在程序设计里的使用频度就不用我说了。一般我们用到的随机算法都是伪随机算法,什么叫伪随机算法呢?伪随机算法意思是假如知道第一个随机种子和随机算法的话就可以推算出下一个随机数。通常我们程序里都是通...
  • hackmind
  • hackmind
  • 2011-05-03 20:13
  • 3117

两种不同随机算法设计理念

随机算法在程序设计里的使用频度就不用我说了。一般我们用到的随机算法 都是伪随机算法,什么叫伪随机算法呢?伪随机算法意思是假如知道第一个随机种子和随机算法的话就可以推算出下一个随机数。通常我们程序里都是...
  • z507263441
  • z507263441
  • 2014-03-01 21:14
  • 705
    个人资料
    • 访问:397295次
    • 积分:7942
    • 等级:
    • 排名:第3044名
    • 原创:401篇
    • 转载:30篇
    • 译文:11篇
    • 评论:87条
    博客专栏