`
mywebcode
  • 浏览: 995499 次
文章分类
社区版块
存档分类
最新评论

STL之函数对象

 
阅读更多

目录


为了使类属算法具有灵活性,STL常使用函数的重载机制为算法提供两种形式。算法的第一种形式使用的是常规的操作来实现。第二种形式中,算法可以根据用户指定的准测对元素经行处理。

函数对象包含了一个可以通过函数调用运算符()使用的函数。实际上,函数对象是重载了函数调用运算符operator()的类模板。

用户可以创建自己的函数对象。STL提供了算术函数对象,关系函数对象,逻辑函数对象。


算术函数对象:

  1. plus<type> 加
  2. minus<type> 减
  3. multiplies<type> 乘
  4. divides<type> 除
  5. modulus<type> 模
  6. negate<type> 取反

示例代码:

#include <iostream>
#include <algorithm>
#include <string>
#include <numeric>
#include <iterator>
#include <vector>
#include <functional>

using namespace std;

int functAdd(plus<int>,int,int);

int main() {
	// 加法函数对象
	plus<int> addNum;
	int sum = addNum(34,56);
	cout << "Sum=" << sum << endl;

	// 字符串拼接
	plus<string> joinString;
	string s1 = "hello";
	string s2 = "There";

	string str = joinString(s1,s2);
	cout << "str=" << str << endl;

	// 调用外部函数
	cout << "funcAdd=" << functAdd(addNum,34,26) << endl;

	int list[8] = {1,2,3,4,5,6,7,8};
	vector<int> intsList(list,list+8);
	ostream_iterator<int> screenOut(cout, " ");

	cout << "intList:";
	copy(intsList.begin(),intsList.end(),screenOut);
	cout << endl;

	//累计
	int suma = accumulate(intsList.begin(),intsList.end(),0);
	cout << "accumulate:" << suma << endl;

	int product = accumulate(intsList.begin(),intsList.end(),1,multiplies<int>());

	cout << "product:" << product << endl;

	return 0;
}

int functAdd(plus<int> sum,int x,int y) {
	return sum(x, y);
}

运行结果:

intQueue.front:26
intQueue.back:33
intQueue.front:18
intQueue :
18 50 33


关系函数对象:

  1. equal_to<type> 等于
  2. not_equal_to<type> 不等于
  3. greater<type> 大于
  4. greater_equal<type> 大于等于
  5. less<type> 小于
  6. less_equal<type> 小于等于

示例代码:

#include <iostream>
#include <algorithm>
#include <string>
#include <numeric>
#include <iterator>
#include <vector>
#include <functional>

using namespace std;

int main() {
	// 等于
	equal_to<int> compare;
	bool isEqual = compare(6,6);
	cout << "isEqual=" << isEqual << endl;

	// 大于
	greater<string> greaterString;
	string s1 = "hello";
	string s2 = "there";

	if (greaterString(s1, s2))
	{
		cout << s1 << " is greater than " << s2 << endl;
	} else {
		cout << s2 << " is greater than " << s1 << endl;
	}

	int temp[8] = {2,3,4,5,1,7,8,9};
	vector<int> vecList(temp,temp+8);
	vector<int>::iterator intItr1,intItr2;
	ostream_iterator<int> screen(cout, " ");
	cout << "vecList:" <<endl;
	copy(vecList.begin(),vecList.end(),screen);
	cout << endl;

	intItr1 = adjacent_find(vecList.begin(),vecList.end(),greater<int>());
	intItr2 = intItr1 + 1;

	cout << "intItr1:" << *intItr1 <<",intItr2:" << *intItr2 << endl;
	cout << "psition:" << vecList.end() - intItr2 << endl;
	cout << "psition:" << intItr2 - vecList.begin() << endl;

	return 0;
}

运行结果:

isEqual=1
there is greater than hello
vecList:
2 3 4 5 1 7 8 9
intItr1:5,intItr2:1
psition:4
psition:4


逻辑运算对象:

  1. logical_not<type>
  2. logical_and<type>
  3. logical_or<type>



分享到:
评论

相关推荐

    stl的介绍 STL算法作为模板函数提供

    关于stl的一些用法 STL算法作为模板函数提供 STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。

    c++ STL标准模板库 关于函数对象的一个实用例子

    这是一个关于函数对象的应用例子 希望对大家有帮助

    effective stl stl 技巧

    条款46:考虑使用函数对象代替函数作算法的参数 条款47:避免产生只写代码 条款48:总是#include适当的头文件 条款49:学习破解有关STL的编译器诊断信息 条款50:让你自己熟悉有关STL的网站 参考书目 附录A:...

    30分钟掌握stl

    STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL...

    stl实现学生成绩管理

    用c++stl实现的学生成绩管理系统,代码简单明了,易懂,且该代码是安全可靠的

    标准模板库STL

    头文件中定义了一些类模板,用以声明函数对象。 (5)适配器(Adaptors)。简单地说就是一种接口类,专门用来修改现有类的接口,提供一种新的接口;或调用现有的函数来实现所需要的功能。 主要包括3种适配器...

    [pdf格式]标准模板库自修教程与参考手册-STL进行C++编程(第二版)

    本书内容分为3部分:第1部分是STL的入门知识,介绍了STL组件,STL与其他软件库的区别,迭代器的概念,STL类属算法,序列容器,有序关联容器,函数对象及容器、迭代器和函数适配器:第2部分是综合运用篇,其中给出了...

    C++ STL开发技术导引(第5章)

    4.4.4 函数对象(Function Object) 54 4.4.5 适配器(Adapter) 55 4.4.6 内存分配器(Allocator) 56 4.4.7 概念(Concept)和模型(Model) 56 4.5 C++ STL存在的一些问题 57 4.6 本章小结 57 第5章 C++ STL...

    函数对象的写法等的实验报告

    函数对象

    STL学习过程中的代码笔记

    同时,STL中的函数对象和仿函数也让我受益匪浅。通过定义自己的函数对象,可以方便地自定义排序规则或者其他操作,使代码更加灵活和可扩展。此外,学习STL的过程中,我也深刻体会到了模板元编程的强大之处。通过使用...

    C++标准的STL介绍

    STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL...

    Effictive STL CHM中文版

    》灰《《常好的STL教程...条款46: 考虑用函数对象代替函数作为算法的参数 条款47: 避免产生只写代码 条款48: 总是#include适当的头文件 条款49: 学会破解STL相关的编译器出错信息 条款50: 让自己熟悉STL相关的网站

    STL 1.算法之1.1Sort用法 及注意事项

    简单举例普通数组、vector、对象排序 ,列举了默认排序、自定义排序,在自定义排序函数注释部分 点明了容易出问题的地方

    STL源码剖析完整版

    第6章 算法(algorithms) 第7章 仿函数(functors,另名 函数对象function objects) 第8章 配接器(adapters) 附录A 参考书籍与推荐读物 附录B 候捷网站(本书支持站点简介) 附录C STLPort 的移植经验(by孟岩)...

    C++STL学习经典

    STL有三大核心部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有STL其他标准组件。

    Effective STL(中文)

    bound、upper_bound和equal_range的区别 条款46:考虑使用函数对象代替函数作算法的参数 条款47:避免产生只写代码 条款48:总是#include适当的头文件 条款49:学习破解有关STL的编译器诊断信息 条款...

    STL源码剖析.pdg

    第7章 仿函数(functor,另名 函数对象function objects) 413 7.1 仿函数(functor)概观 413 7.2 可配接(adaptable)的关键 415 7.2.1 unary_function 416 7.2.2 binary_function 417 7.3 算术类...

    30分钟学会STL.doc

    STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL...

    C++标准库STL源码

    下面是对SGI STL源码的一些关键特点和描述:泛型编程、算法与容器的分离、迭代器、函数对象等。 SGI STL的源码是学习和理解STL实现原理的宝贵资源。它展示了如何使用C++的语言特性和编程技巧来设计和实现高效、灵活...

    STL 源码剖析(侯捷先生译著)

    第7章 仿函数(functor,另名 函数对象function objects) 413 7.1 仿函数(functor)概观 413 7.2 可配接(adaptable)的关键 415 7.2.1 unary_function 416 7.2.2 binary_function 417 7.3 算术类...

Global site tag (gtag.js) - Google Analytics