SGI-STL简记(十一)-适配器(容器、迭代器、仿函数)

适配器(adapters):

    概念上类似于设计模式中的适配,此处STL中的适配器可对组件的组合、灵活运用扮演重要角色。
    STL中适配器主要有:容器适配器、迭代器适配器、仿函数适配器

容器适配器:

    queue(先进先出)、stack(先进后出)、priority_queue(优先队列)适配器,即queue和stack的_Sequence序列模板参数默认类型为deque<T>(双端队列),
    当然也可以是其他满足适配器的必要接口的容器也可,故这几个可认为是序列模板容器_Sequence的包装器。

迭代器适配器:

    insert iterator 插入迭代器(通过重载operator=,即赋值的方式来插入元素),主要有以下几个包装迭代器:
        back_insert_iterator(调用容器的push_back插入);
        front_insert_iterator(调用容器的push_front插入);
        insert_iterator(调用容器的insert在指定迭代器位置后插入);

        对应生成以上三种迭代器的便利函数:back_inserter、front_insert、inserter;

    reverse iterator 逆转迭代器(即将原本operator++变为后退操作,operator--变为前进操作)
        reverse_iterator逆转迭代器类,提供了基本的逆转迭代操作(内部引用包含了一个iterator迭代器,即可认为逆转迭代器包装了容器迭代器);
        此外部分容器的rbegin()、rend()可分别返回含尾部迭代器、首部迭代器位置的逆转迭代器。

    iostream iterator IO流迭代器(绑定iostream对象到迭代器上,操作迭代器时可方便地操作数据流对象)
        本质上,IO流迭代器内部维护一个stream流对象,当对迭代器对象执行输入或输出操作时,即转接调用到stream流对象上的操作。
        istream_iterator包装istream对象;ostream_iterator包装ostream对象。

仿函数适配器:

    可以实现无限次适配(包装)(也即可用仿函数包装仿函数),通过绑定、组合和修饰,可以实现各种复杂的表达式。
    此外,一个可适配的对象,应是可适配的,也即是一元仿函数需继承unary_function、二元仿函数需继承自binary_function,
    而对成员函数则应以mem_fun包装处理,一般函数应以ptr_fun包装处理。也就是说,若是可适配的,则可实现无限包装。

    常见的仿函数适配器:
        bind1st、bind2nd、not1、not2、compose1、compose2、ptr_fun、mem_fun、mem_fun_ref、mem_fun1、mem_fun1_ref等。
    

原文地址:https://www.cnblogs.com/haomiao/p/11666283.html

时间: 2024-10-12 12:08:19

SGI-STL简记(十一)-适配器(容器、迭代器、仿函数)的相关文章

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

SGI STL functors(仿函数) 12

函数对象,即"行为类似函数"的对象,重载function call运算子(operator ()).STL仿函数根据操作数个数划分,可分为一元和二元仿函数,按功能划分可分为算数运算.关系运算.逻辑运算三大类.使用内建仿函数需包含<functional>头文件. 仿函数可配接的关键 为了拥有配接能力,需要依照规定定义自己的5个相应型别.仿函数的相应型别主要用来表现函数参数型别和传回值型别.为了方便期间,<stl_function.h>定义了两个class,分别表示

STL之stack适配器的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 一提到适配器(adapter),我们就想到了早期用电话线上网所用的调制解调器,俗称"猫","猫"的作用是实现数模转化和模数转化,在客户端,它可以将电话的模拟信息转化为我们计算机能够接收的数字信息,所以猫相当于一个转换器.再举个更加好理解的例子来说明"适配器"的含义.相信在我们每个人的家里都有插排,假设就这么一种情况,现在我们家里的墙壁上只有一个三角的插口,而我们的电视却是两个口,怎么办?毫无疑问

STL学习笔记--3、迭代器iterator与traits编程

iterator模式:提供一种方法,依次巡访某个聚合物(容器)所含的各个元素,而无需暴露该聚合物的内部表达式. 1.迭代器设计思维 STL在于将数据容器和算法分开,彼此独立,最后再以一帖粘合剂将它们撮合在一起.只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作. 算法find():接受两个迭代器和一个搜寻目标. //摘自SGI<stl_algo.h> template <class InputIterator, class T> InputIterator find(Inp

泛型编程与STL--各类容器迭代器失效的场景

各类容器迭代器失效的场景: 其实在定义迭代器失效的时:在某些操作完成以后,认为这个迭代器指向的值有变化或者迭代器直接指向不合法的空间,都认为迭代器失效.只要不是指向操作之前的值都认为迭代器失效. 当要将元素安插于vector内,大小与容量之间的差别就变得格外重要.如果vector的大小等于其容量,安插新元素的唯一方法就是增加这个vector的内存总量,这意味得分配一块新的而且更大的内存,再将旧内存块的内容复制到新内存块中,然后归还旧内存块. 一旦vector的内存重新分配,其iterators便

STL源码剖析 容器 stl_hashtable.h

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie hashtable --------------------------------------------------------------------------- 二叉搜索树具有对数平均时间的表现,它建立在输入数据有足够的随机性的假设 hashtable 有常数平均时间的表现,基于统计,不需依赖输入元素的随机性 hashtalbe 的简单实现: 所有元素都 16-bits 不带正负

stl中顺序性容器,关联容器两者粗略解释

什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种"对象"还包含了一系列处理"其它对象"的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是"容器类是一种对特定代码重用问题的良好的解决方案". 容器还有另一个特点是容器可以自行扩展.在解决问题时

SGI STL源码stl_bvector.h分析

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

容器迭代器

容器迭代器 尽管C++指针也是迭代器,但用的更多的是容器迭代器.容器迭代器用法和iterdemo.cpp一样,但和将迭代器申明为指针变量不同的是,你可以使用容器类方法来获取迭代器对象.两个典型的容器类方法是begin()和end().它们在大多数容器中表示整个容器范围.其他一些容器还使用rbegin()和rend()方法提供反向迭代器,以按反向顺序指定对象范围. 下面的程序创建了一个矢量容器(STL的和数组等价的对象),并使用迭代器在其中搜索.该程序和前一章中的程序相同. Listing 2.