SGI STL functors(仿函数) 12



函数对象,即”行为类似函数”的对象,重载function call运算子(operator ())。

STL仿函数根据操作数个数划分,可分为一元和二元仿函数,按功能划分可分为算数运算、关系运算、逻辑运算三大类。
使用内建仿函数需包含<functional>头文件。

仿函数可配接的关键



为了拥有配接能力,需要依照规定定义自己的5个相应型别。仿函数的相应型别主要用来表现函数参数型别和传回值型别。
为了方便期间,<stl_function.h>定义了两个class,分别表示一元仿函数和二元仿函数(STL不支持三元仿函数),其中只有型别定义,没有成员函数和成员变量。任何仿函数只需要根据需求继承其中一个class即可拥有相应型别,也就自动拥有了配接能力。

unary_function

unary_function用来呈现一元仿函数的参数型别和返回值型别。

12345
template <class _, class _Result>struct unary_function {  typedef _Arg argument_type;  typedef _Result result_type;};

binary_function

binary_function用来呈现二元函数的第一参数型别、第二参数型别、返回值型别。

123456
template <class _Arg1, class _Arg2, class _Result>struct binary_function {  typedef _Arg1 first_argument_type;  typedef _Arg2 second_argument_type;  typedef _Result result_type;};

binder1st配接器用于将某个二元仿函数转化为一元仿函数

12345678910111213141516
template <class _Operation>class binder1st  : public unary_function<typename _Operation::second_argument_type,                          typename _Operation::result_type> {protected:  _Operation op;  typename _Operation::first_argument_type value;public:  binder1st(const _Operation& __x,            const typename _Operation::first_argument_type& __y)      : op(__x), value(__y) {}  typename _Operation::result_type  operator()(const typename _Operation::second_argument_type& __x) const {    return op(value, __x);  }};

算数仿函数



STL内建算数仿函数支持加、减、乘、除、求余、否定运算。除了否定运算其它均为二元运算。

  • 加:plus<T>
  • 减:minus<T>
  • 乘:multiplies<T>
  • 除:divides<T>
  • 求余:modulus<T>
  • 否定:negate<T>

关系运算类仿函数



STL内建关系运算符仿函数支持等于、不等于、大于、大于等于、小于、小于等于六类。每一个都是二元源算。

  • 等于:equal_to<T>
  • 不等于:not_equal_to<T>
  • 大于:greater<T>
  • 大于等于:greater_equal<T>
  • 小于:less<T>
  • 小于等于:less_equal<T>

逻辑运算符仿函数



STL内建的逻辑运算符仿函数支持And、Or、Not三种,And和Or为二元运算符,Not为一元运算符。

  • And:logical_and<T>
  • Or:logical_or<T>
  • Not:logical_not<T>

功能极其简单的仿函数都是为了搭配STL算法。



原文:大专栏  SGI STL functors(仿函数) 12

原文地址:https://www.cnblogs.com/sanxiandoupi/p/11631618.html

时间: 2024-11-05 19:40:03

SGI STL functors(仿函数) 12的相关文章

SGI STL内存配置器(一):内存泄漏?

阅读了Alexander大神的SGI STL源码,膜拜,很高质量的源码,获益匪浅.温故而知新!下文中所有STL如无特殊说明均指SGI版本实现. STL 内存配置器 STL对内存管理最核心部分我觉得是它将C++对象创建过程分解为构造.析构和内存分配.释放!摆脱了由于频繁调用new或malloc函数向操作系统申请空间而造成的低效.其中析构操作时对具有non-trival.trival 析构函数的class区别对待也提高了效率.至于SGI的两级配置器结构则属于锦上添花的类型. STL两级结构的内存配置

SGI STL的 power 函数之个人理解

SGI STL的power函数用于计算某数的n次方 例如求 x的n次幂 n = 20 (20 二进制 10100) 1 0 1 0 0 20 = 2^4 + 2^2 x^20 = x^((2^4) + (2^2)) = x^( 2^4 ) * x ^( 2^2) part2 part1 template <class _Tp, class _Integer, class _MonoidOperation> _Tp __power(_Tp __x, _Integer __n, _MonoidOp

2.SGI STL第二级空间配置器__default_alloc_template的chunk_alloc函数

SGISTL默认使用二级空间配置器,当需要配置的区块大于128 bytes时SGI STL调用一级空间配置器,一级空间配置器的allocate函数直接使用malloc分配内存,deallocate函数直接使用free释放内存.当需要配置的区块小于128 bytes时SGI STL调用二级空间配置器. 相比于一级空间配置器简单粗暴的内存使用方法,二级空间配置器对内存的使用显得精细很多. 二级空间配置器的具体用法请看书,我就不抄书了,只对二级空间配置器中容易糊涂的地方写一下我的理解. 内存池和fre

SGI STL内存管理

在SGI STL版本的内存管理中,使用这样一种方式来分配内存:内存分配+对象初始化.首先是分配内存,其次是根据对象的类型(是否为POD[Plain of Data])来使用最有效的方式来初始化对象.回收内存也是用同样的方式:析构对象+回收内存,根据对象是否为POD类型,确定最有效的析构方式. SGI STL使用双层级配置器,第一级配置器直接使用malloc()和free(),第二级根据如下策略:当配置区块>128 Bytes时,视之为"足够大",调用一级配置器,否则视之为过小,调

SGI STL源码stl_bvector.h分析

前言 上篇文章讲了 STL vector 泛化版本的实现,其采用普通指针作为迭代器,可以接受任何类型的元素.但如果用来存储 bool 类型的数据,可以实现功能,但每一个 bool 占一个字节(byte),而一个字节有 8 位(bit),这样就有点浪费了.所以 SGI STL 设计了一个特化版本的位向量容器 bit_vector 来节省空间内存.bit_vector 是一个 bit 位元素的序列容器,具有 vector 容器一样的成员函数,常用于硬件端口的控制. 原文地址:https://www.

浅析STL 谓词 + 仿函数 + 函数指针(c)

一:起因 (0)提到C++ STL,首先被人想到的是它的三大组件:Containers(容器), Iterators(迭代器), Algorithms(算法).容器为用户提供了常用的数据结构(如,vector,list,deque,stack,map,multimap,set,multiset,外加string),算法大多是独立于容器的常用的基本算法(一般在algorithm头文件中,其中sort比较常用),迭代器是由容器提供的一种接口,算法通过迭代器来操控容器.详情请看 博客 (1)接下来要介

STL基础--仿函数(函数对象)

1 首先看个仿函数的例子 class X { public: void operator()(string str) { // 函数调用运算符,返回类型在operator之前 cout << "Calling functor X with parameter " << str<< endl; } operator string () const { return "X"; } //类型转换函数,返回类型在operator之后 };

SGI STL内存配置器存在内存泄漏吗?

阅读了SGI的源码后对STL很是膜拜,很高质量的源码,从中学到了很多.温故而知新!下文中所有STL如无特殊说明均指SGI版本实现. STL 内存配置器 STL对内存管理最核心部分我觉得是其将C++对象创建过程分解为构造.析构和内存分配.释放两类操作分离开来!摆脱了对频繁调用new或malloc函数想操作系统申请空间而造成的低效.其中析构操作时对具有non-trival.trival 析构函数的class区别对待也提高了效率.SGI 的两级配置器结构属于锦上添花. STL内存配置器有没有内存泄漏?

C++STL:仿函数

C++仿函数应用实例 #include <iostream> #include <list> #include <algorithm> using namespace std; template<class T> struct GT { GT (const T& a) : m_a(a) {} bool operator()(const T& left) { return left >= m_a; } T m_a; }; int main