STL源码分析--仿函数 & 模板的模板参数 & 临时对象

STL源码分析—使用的一些特殊语法

关于泛型编程中用到的一些特殊语法,这些语法也适用于平常的模板编程

1、  类模板中使用静态成员变量

Static成员变量在类模板中并不是很特殊,同时这个变量不属于对象,属于实例化以后的这个类类型。每一个实例化对应一个static变量

2、  类模板中可以再有模板成员

3、  模板参数可以根据前一个模板参数而设定默认值

4、  类模板可以拥有非类型的模板参数

所谓非类型的模板参数就是内建型的模板参数

Template <class T,class Alloc = alloc,size_t bufsize =0>最后一个参数就是非类型的模板参数

5、  静态常量整数成员在class内部直接初始化(关于这个点的内容在上一篇文章中有介绍)

6、  关于自增自减操作符重载,它的重载和前置后置有关 返回临时变量 返回引用

7、  STL中的区间都是符合前闭后开区间表示方法

8、  临时对象的产生于运用

所谓临时对象,就是一种无名对象。它的出现如果不在程序员的预期之下(例如任何pass by value操作都会引发copy操作,于是形成一个临时对象),往往造成效率上的负担,但有时候可以制造一些临时对象,却又使得程序干净清爽。可以制造临时对象的方法是:在型别名称之后直接加一对小括号,并可指定初值,例如Sharpe(3,5)或者int(6),其意义相当于用相应的构造函数且不指定对象名称,STL中最常使用这样的技巧在仿函数与算法的搭配上。

Class print

{

Public:

Void operator(){costT& elem}

{

Cout<<elem<<endl;   //operator()重载

}

};

For_each(vi.begin(),vi.end(),print<int>());

Print<int>()是一个临时对象,不是一个函数调用操作

最后一行便是产生“classtemplate实例化”print<int>的一个临时对象。这个对象将被传入for_earch()之中的起作用,当for_earch()结束时,这个临时对象也就结束了它的生命

Function call 操作符(operator())

这里直接进入正题说仿函数的事情

STL算法的特殊版本所接收的所谓“条件”或“策略”或“一整组操作”,都是以仿函数形式呈现,所谓仿函数就是使用起来像函数一样的东西,如果你针对某个class进行operator()重载,它就成为一个仿函数,至于成为一个可配接的仿函数,还需要一些努力

Template <class T>

Struct plus{

Toperator()(const T& x,const T& y) const

{

Return x+y;

}

};

Template <class T>

Struct minus{

Toperator()(const T& x,const T& y) const

{

Return x+y;

}

};

Int main()

{

//产生的仿函数对象

Plus<int>  plusobj;

Minus<int>  minusobj;

//以下使用仿函数,就像使用一般函数一样

Cout<<plusobj(3,5)<<endl;    //5

Cout<<minus(3,5)<<endl;  // -2

//以下直接产生仿函数的临时对象(第一对小括号),并调用之(第二对小括号)

Cout<<plus<int>()(3,3)<<endl;

Cout<<minus<int>()(4,3)<<endl;

}

至于模板的模板参数,在定义stack的时候用到过

template <typename T, classSeq=vector<T> >

class myself

{

private:

Seq c;

};

也可以这样

template <typename T,template<typename M> class Seq=vector >

class myself

{

private:

Seq<T> c;

};

也可以这样

template <typename T,template<typename M,typename Alloc=std::allocator<T> > classSeq=vector >

class myself

{

private:

Seq<T> c;

};

好好揣摩着几种定义方式的技巧

时间: 2024-08-06 02:14:03

STL源码分析--仿函数 & 模板的模板参数 & 临时对象的相关文章

STL源码分析--仿函数 &amp; 配接器

STL源码分析-仿函数 & 配接器 仿函数就是函数对象.就实现观点而言,仿函数其实就是一个"行为类似函数"的对象.为了能够"行为类似函数",其类别定义中必须自定义(或说改写.重载)function call 运算子(operator()),拥有这样的运算子后,我们就可以在仿函数的对象后面加上一对小括号,以此调用仿函数所定义的operator().仿函数作为可配接的关键因素. 配接器在STL组件的灵活组合运用功能上,扮演着轴承.转换器的角色,adapter的定

STL源码分析--空间配置器的底层实现 (二)

STL源码分析-空间配置器 空间配置器中门道 在STL中的容器里都是使用统一的空间配置器,空间配置器就是管理分配内存和销毁内存的.在STL将在heap空间创建一个对象分为两个步骤,第一是申请一块内存,第二是在这块内存中初始化一个对象.首先申请空间是由malloc提供,初始化一个对象时由constructor管理.销毁一个对象也是由两步骤完成,第一是销毁空间上的对象,第二是释放这块内存. 同时,STL的空间配置器分为两级内存,如果申请的内存空间大于128KB,那么就使用第一级空间配置,如果小于,那

stl源码分析之hash table

本文主要分析g++ stl中哈希表的实现方法.stl中,除了以红黑树为底层存储结构的map和set,还有用哈希表实现的hash_map和hash_set.map和set的查询时间是对数级的,而hash_map和hash_set更快,可以达到常数级,不过哈希表需要更多内存空间,属于以空间换时间的用法,而且选择一个好的哈希函数也不那么容易. 一. 哈希表基本概念 哈希表,又名散列表,是根据关键字直接访问内存的数据结构.通过哈希函数,将键值映射转换成数组中的位置,就可以在O(1)的时间内访问到数据.举

stl源码分析之priority queue

前面两篇介绍了gcc4.8的vector和list的源码实现,这是stl最常用了两种序列式容器.除了容器之外,stl还提供了一种借助容器实现特殊操作的组件,谓之适配器,比如stack,queue,priority queue等,本文就介绍gcc4.8的priority queue的源码实现. 顾名思义,priority queue是带有优先级的队列,所以元素必须提供<操作符,与vector和list不同,priority queue允许加入元素,但是取出时只能取出优先级最高的元素. 一. pri

stl源码分析之list

本文主要分析gcc4.8版本的stl list的源码实现,与vector的线性空间结构不同,list的节点是任意分散的,节点之间通过指针连接,好处是在任何位置插入删除元素都只需要常数时间,缺点是不能随机访问,查询复杂度是O(n),n为list中的元素个数.所以list非常适合应用与数据插入删除频繁的场景. 一. list节点 list节点定义如下, struct _List_node_base { _List_node_base* _M_next; _List_node_base* _M_pre

stl源码分析之vector

上篇简单介绍了gcc4.8提供的几种allocator的实现方法和作用,这是所有stl组件的基础,容器必须通过allocator申请分配内存和释放内存,至于底层是直接分配释放内存还是使用内存池等方法就不是组件需要考虑的事情.这篇文章开始分析gcc4.8 stl的容器源码实现.stl的容器分为序列式容器和关联式容器,前者包括vector,list,queue以及stack等常用数据结构,后者包含了map,set以及hash table等比较高级的结构,本文就从使用最广泛也是最基础的vector开始

STL 源码分析 # stl_iterator &amp; stl_iterator_base #

STL 源码分析 # stl_iterator_base && stl_iterator # 这里能很清楚的看到各个基础类型的继承关系 template <class _Tp, class _Distance> struct input_iterator { typedef input_iterator_tag iterator_category; typedef _Tp value_type; typedef _Distance difference_type; typede

nginx源码分析--nginx外部信号 命令参数

nginx命令行参数 不像许多其他软件系统,Nginx 仅有几个命令行参数,完全通过配置文件来配置 -c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的. -t 不运行,而仅仅测试配置文件.nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件. -v 显示 nginx 的版本. -V 显示 nginx 的版本,编译器版本和配置参数. nginx控制信号 可以使用信号系统来控制主进程.默认,nginx 将其主进程的 pid 写入到 /u

zg手册 之 python2.7.7源码分析(2)-- python 的整数对象和字符串对象

python 中的内置对象 python 中常用的内置对象有:整数对象,字符串对象,列表对象,字典对象.这些对象在python中使用最多,所以在实现上提供缓存机制,以提高运行效率. 整数对象 (PyIntObject) python 中的整数对象是不可变对象(immutable),即创建了一个 python 整数对象之后,不能再改变该对象的值. python 为创建整数对象提供了下面三种方法,其中 PyInt_FromString 和 PyInt_FromUnicode 内部也是调用 PyInt