C++primer第九章 顺序容器 9.6 容器适配器

9.6容器适配器

  • 除了顺序容器外,标准库还定义了三个顺序容器适配器:stack、queue和priority_queue
  • 适配器(adaptor)是标准库中的一个通用概念。容器、迭代器和函数<369I
  • 都有适配器。本质上,一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样。一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型
  • 例如,stack适配器接受一个顺序容器(除array或forward_list外),并使其操作起来像一个stack一样(外层包装)。表9.17列出了所有容器适配器都支持的操作和类型。

定义一个适配器

  • 每个适配器都定义两个构造函数:默认构造函数创建一个空对象,接受一个容器的构造函数拷贝该容器来初始化适配器。例如,假定deq是一个deque<int>,我们可以用deq来初始化一个新的stack,如下所示:
  • stack<int>stk(deq);//从deq拷贝元素到stk
  • 默认情况下,stack和queue是基于deque实现的,priority_queue是在vector之上实现的。我们可以在创建一个适配器时将-个命名的顺序容器作为第二个类型参数,来重载默认容器类型。
  • //在vector_h实现的空栈
  • stack<string,vector<string>> str_stk;
  • stack<string,vector<string>>str_stk2(svec);   //str_stk2在vector上实现,初始化时保存svec的拷贝
  • 对于一个给定的适配器,可以使用哪些容器是有限制的。所有适配器都要求容器具有添加和删除元素的能力。因此,适配器不能构造在array之上。类似的,我们也不能用forward_list来构造适配器,因为所有适配器都要求容器具有添加、删除以及访问尾元素的能力
  • stack只要求push_back、pop_back和back操作,因此可以使用除array和forward_list之外的任何容器类型来构造stack。
  • queue适配器要求back、push_back、front和push_front,因此它可以构造于list或deque之上,但不能基于vector构造。
  • priority_queue除了front、push_back和pop_back操作之外还要求随机访问能力,因此它可以构造于vector或deque之上,但不能基于list构造。

栈适配器

  • stack类型定义在stack头文件中。表 9.18列出了 stack所支持的操作。下面的 程序展示了如何使用stack:
  • stack<int> intStack; // 空栈
  • / / 填满栈
  • for (size_t ix = 0; ix != 10; ++ix)
  • intStack.push (ix) ; // intStack 保存 0 到 9 十个数
  • while (! intStack. empty () ) ( // intStack 中有值就继续循环
  • int value = intStack.top();
  • / / 使用栈顶值的代码
  • intStack.pop () ; / / 弹出栈顶元素,继续循环
  • }
  • 其中,声明语句
  • stack<int> intStack; // 空栈
  • 定义了一个保存整型元素的栈intStack,初始时为空。for循环将10个元素添加到栈 中,这些元素被初始化为从0 开始连续的整数。while循环遍历整个stack,获取top 值,将其从栈中弹出,直至栈空。

  • 每个容器适配器都基于底层容器类型的操作定义了自己的特殊操作。我们只可以使用适配器操作,而不能使用底层容器类型的操作。例如,
  • intStack.push(ix);//intStack保存0到9十个数
  • 此语句试图在intStack的底层deque对象上调用push_back
  • 虽然stack是基于deque实现的,但我们不能直接使用deque操作。不能在一个stack调用push_back,而必须使用stack自己的操作push

队列适配器

  • queue和 priority_queue适配器定义在queue头文件中。表 9.19列出了它们所支持的操作。

  • 标准库queue使用一种先进先出(first-in,first-out,FIFO)的存储和访问策略。进入队列的对象被放置到队尾,而离开队列的对象则从队首删除。饭店按客人到达的顺序来为他们安排座位,就是一个先进先出队列的例子。
  • priority_queue允许我们为队列中的元素建立优先级。新加入的元素会排在所有优先级比它低的已有元素之前。饭店按照客人预定时间而不是到来时间的早晚来为他们安排座位,就是一个优先队列的例子。默认情况下,标准库在元素类型上使用〈运算符来确定相对优先级。我们将在11.2.2节(第378页)学习如何重载这个默认设置。

小结

  • 标准库容器是模板类型,用来保存给定类型的对象。在一个顺序容器中,元素是按顺序存放的,通过位置来访问。顺序容器有公共的标准接口:如果两个顺序容器都提供一个特定的操作,那么这个操作在两个容器中具有相同的接口和含义。
  • 所有容器(除arrav外)都提供高效的动态内存管理。我们可以向容器中添加元素,不必担心元素存储在哪里。容器负责管理自身的存储。vector和string都提供更细致的内存管理控制,这是通过它们的reserve和capacity成员函数来实现的.
  • 很大程度,容器只定义了极少的操作。每个容器都定义了构造函数、添加和删除元素的操作、确定容器大小的操作以及返回指向特定元素的迭代器的操作。其他一些有用的操作,如排序或搜索,并不是由容器类型定义的,而是由标准库算法实现的,我们将在第I0章介绍这些内容。
  • 当我们使用添加和删除元素的容器操作时,必须注意这些操作町能使指向容器中元素的迭代器、指针或引用失效。很多会使迭代器失效的操作,如insert和erase,都会返回一个新的迭代器,来带助程序员维护容器中的位置。如果循环程序中使用了改变容器大小的操作,就要尤其小心其中迭代器、指针和引用的使用。

术语表

  • 适配器(adaptor)标准阵类型、函数或送代器,它们接受一个类型、函数或迭代器,使其行为像另外一个类型、函数或迭代器-样。标准应提供了:一种顺序容器适配器:stack,queue和priority_queue每个适配器都在其底层顺序容器类型之上定义了一个新的接口。
  • 数组(array)固定大小的顺序容器。为了定义一个array,除了元素类型之外还必须给定大小.array中的元素可以用其位置下标来访问。array支持快速的随机访问
  • begin容器操作,返回个指向容器首元素的迭代器,如果容器为空,则返回尾后迭代器。是否返回const迭代器依赖于容器的类型。
  • cbegin容器操作,返回一个指向容器首元素的const_iterator,如果容器为空,则返回尾后迭代器
  • cend容器操作,返回个指向容器尾元素之后(不存在:的)的const_iterator.
  • 容器 container 保存-组给定类型对象的类型。每个标准库容器类型都是一个模板类型。为了定义一个容器,我们必须指定保存在容器中的元素的类型。除了array之外,标准库容器都是大小可变的。
  • deque顺序容器。deque中的元素可以通过位置下标来访问。支持快速的随机访问。deque各方面都和vector类似,唯一的差别是,deque支持在容器头尾位置的快速插入和删除,而目.在两端插入或删除元素都不会导致重新分配空间.
  • end容器操作,返回-个指向容器尾元素之后(不存在的)元素的迭代器。是否返回const迭代器依赖于容器的类型
  • forward_ist顺序容器,表示一个单向链表。forward_listr的元素只能顺序访问。从一个给定元素开始,为了访问另-个元素,我们只能遍历两者之间的所有元素。forward_list上的迭代器不支持递减运算(一).forward_list支持任意位置的快速插入(或删除)操作。与其他容器不同,插入和删除发生在一个给定的迭代器之后的位置。因此,除了通常的尾后迭代器之外,forward_list还有一个“首前”迭代器。在添加新元素后,原有的指向forward_list的迭代器仍有效。在删除元素后,只有原来指向被删元素的迭
  • 代器才会失效。
    迭代器范围(iteratorrange)由一对迭代器指定的元素范围。第一个迭代器表示序列中第一个元素,第二个迭代器指向最后-个元素之后的位置。如果范围为空,则两个迭代器是相等的(反之亦然,如果两个迭代器不等,则它们表示一个非空范围).如果范围非空,则必须保证,通过反复递增第一个迭代器,可以到达第二个迭代器。通过递增迭代器,序列中每个元素都能被访问到。
  • 左闭合区间(left-inclusiveinterval)值范围,包含首元素,但不包含尾元素。通常表示为[i,j)表示序列从i开始(包含)直至j结束(不包含)。list顺序容器,表示一个双向链表。list中的元素只能顺序访问。从一个给定元素开始,为了访问另一个元素,我们只能遍历两者之间的所有元素。list上的迭代器既支持递增运算(++),也支持递减运算(--)olist支持任意位置的快速插入(或删除)操作。当加入新元素后,迭代器仍然有效。当删除元素后,只有原来指向被删除元素的迭代器才会失效。
  • 首前迭代器(off-the-beginningiterator)表示一个forwardlist开始位置之前(不存在的)元素的迭代器。是forward_list的成员函数before_begin的返回值。与end()迭代器类似,「不能被解引用。
  • 尾后迭代器(off-the-enditerator)表示范围中尾元素之后位置的迭代器。通常被称为“末尾迭代器"(enditerator)。
  • priority_queue顺序容器适配器,生成一个队列,插入其中的元素不放在末尾,而是根据特定的优先级排列。默认情况下,优先级用元素类型上的小于运算符确定。
  • queue顺序容器适配器,生成一个类型,使我们能将新元素添加到末尾,从头部删除元素。
  • 顺序容器(sequentialcontainer)保存相同类型对象有序集合的类型。顺序容器中的元素通过位置来访问。
  • stack顺序容器适配器,生成一个类型,使我们只能在其一端添加和删除元素。
  • vector顺序容器。vector中的元素可以通过位置下标访问。支持快速的随机访问。我们只能在vector末尾实现高效的元素添加/删除。向vector添加元素可能导致内存空间的重新分配,从而使所有指向vector的迭代器失效。在vector内部添加(或删除)元素会使所有指向插入(删除)点之后元素的迭代器失效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot Controller接收参数的常用方式

文章目录一、请求路径参数1、PathVariable二、Body参数1、RequestParam2、RequestBody三、请求头参数和Cookie参数1、RequestHeader2、CookieValue一、请求路径参数 1、PathVariable 注解为&#xff1a; org.springframework.web.bind.annotation.PathVariable获取路径参数&…

C++primer第十章 泛型算法 10.1 概述 10.2 初识泛型算法

大多数算法都定义在头文件algorithm中。标准库还在头文件numeric中定义了 一组数值泛型算法一般情况下&#xff0c;这些算法并不直接操作容器&#xff0c;而是遍历由两个迭代器指定的一个元素范围(参见9.2.1节&#xff0c;第296页)来进行操作。通常情况下&#xff0c;算法遍历范…

MySQL Mac安装教程

文章目录一、下载安装包二、安装三、启动MySQL四、环境变量设置一、下载安装包 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 二、安装 双击安装包&#xff0c;然后一直点继续即可。 三、启动MySQL 打开 系统偏好设置&#xff0c;会发现多了一个…

C++生成指定范围内的随机数

代码 rand&#xff08;&#xff09;% 3 &#xff1b; 3就是范围&#xff0c;代表生成[0,3)之间的随机数 int main(){for (int i 0; i < 20; i) {switch (rand() % 3) {case 0:std::cout << "00" << std::endl;case 1:std::cout << "11&q…

C++primer第十章 泛型算法 10.3 定制操作

10.3定制操作 很多算法都会比较输入序列中的元素。默认情况下&#xff0c;这类算法使用元素类型的&#xff1c;或运算符完成比较。标准库还为这些算法定义了额外的版本&#xff0c;允许我们提供自己定义的操作来代替默认运算符。例如&#xff0c;sort算法默认使用元素类型的&l…

C++primer第十章 泛型算法 10.4 再探迭代器 10.5 泛型算法结构

除了为每个容器定义的迭代器之外&#xff0c;标准库在头文件iterator中还定义了额外几种迭代器。这些迭代器包括以下几种。插入迭代器(insert iterator)&#xff1a;这些迭代器被绑定到一个容器上&#xff0c;可用来向容器插入元素。流迭代器(stream iterator)&#xff1a;这些…

C++primer第十一章 关联容器 11.1使用关联容器 11.2 关联容器概述

关联容器和顺序容器有着根本的不同&#xff1a;关联容器中的元素是按关键字来保存和访问的。与之相对&#xff0c;顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。虽然关联容器的很多行为与顺序容器相同&#xff0c;但其不同之处反映了关键字的作用关联容器支持高…

Redis Mac下安装与使用

目录一、下载安装包二、编译三、服务端与客户端命令1、服务端启动命令2、客户端连接命令3、服务端关闭命令一、下载安装包 官网地址&#xff1a;http://redis.io/download 下载后&#xff0c;解压放到任意目录下。 二、编译 打开终端&#xff0c;切换到 Redis 根目录&#x…

C++primer第十一章 关联容器 11.3关联容器操作 11.4 无序容器

11.3关联容器操作 除了表9.2(第295页)中列出的类型&#xff0c;关联容器还定义了表11.3中列出的类型。这些类型表示容器关键字和值的类型。对于set类型&#xff0c;key_type和value type是一样的&#xff1b;set中保存的值就是关键字。在一个map中&#xff0c;元素是关键字_值…

SpringBoot 整合Dubbo

文章目录一、工程目录结构二、创建工程项目1、创建接口工程&#xff08;cw-dubbo-api&#xff09;&#xff08;1&#xff09;pom.xml&#xff08;2&#xff09;创建接口类&#xff08;LoginService&#xff09;2、创建服务提供者工程&#xff08;cw-dubbo-provider&#xff09;…

C++primer第一章 开始

运算符打印endl,这是一个被称为操纵符(manipulator)的特殊值。写入endl 的效果是结束当前行&#xff0c;并将与设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中&#xff0c;而不是仅停留在内存中等待写入流…

硬盘 相关知识

磁盘存储数据于轨道上&#xff0c;为了防止数据不被干扰&#xff0c;轨道之间是存在间隙的。如果间隙越小存储的数据越多&#xff0c;但是对数据的写入和读取所使用的磁头是不一样的&#xff0c;写入的磁头比较宽&#xff0c;读取的磁头比较窄。叠瓦式硬盘&#xff0c;将轨道和…

C++primer 第 2 章 变量和基本类型

2.1 基本内置类型 算术类型&#xff08;arithmetictype&#xff09;和空类型&#xff08;void&#xff09;在内的基本数据类型。其中算术类型包含了字符、整型数、布尔值和浮点数。空类型不对应具体的值&#xff0c;仅用于一些特殊的场合&#xff0c;例如最常见的是&#xff0…

SpringBoot 集成Mybatis

文章目录一、创建SpringBoot项目二、添加Mybatis相关依赖三、数据源配置四、创建事务的模型实体类五、创建和数据库交互联系的映射关系类六、创建业务接口和实现类七、创建控制器类八、请求验证一、创建SpringBoot项目 如何创建详见&#xff1a;IDEA 创建 SpringBoot 项目 二、…

C++primer 第 3 章 字符串、向量和数组 3.1 命名空间的using声明 3.2标准库类型string

引言 除了第2章介绍的内置类型之外,C语言还定义了 -个内容丰富的抽象数据类型库。其中,string和 vector是两种最重耍的标准库类型&#xff0c;前者支持可变长字符串&#xff0c;后者则 表示可变长的集合。还有…种标准库类型是迭代器&#xff0c;它是string和vector的配套类型…

C++primer 第 3 章 字符串、向量和数组 3 . 3 标准库类型vector

标准库类型vector表示对象的集合&#xff0c;其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引&#xff0c;索引用于访问对象。因为vector"容纳着”其他对象&#xff0c;所以它也常被称作容器(container).第 II部将对容器进行更为详细的介绍。 要想使用…

SpringBoot AOP切面实现

文章目录一、AOP简介二、AOP体系与概念三、AOP实例1、创建SpringBoot工程2、添加依赖3、AOP相关注解3.1、Aspect3.2、Pointcut3.2.1、execution()3.2.2、annotation()3.3、Around3.4、Before3.5、After3.6、AfterReturning3.7、AfterThrowing一、AOP简介 AOP&#xff08;Aspec…

英语口语-文章朗读Week8 Friday

文章 It is a phenomenon that people are losing trust in each other in today’s society. Some people become selfish,and for interest, they are likely to betray their colleagues,friends, and even their relatives. They tend to cater to those who can benefit …

C++primer 第 3 章 字符串、向量和数组 3 . 4 迭代器介绍

3.4迭代器介绍 我们已经知道可以使用下标运算符来访问string对象的字符或vector对象的元素&#xff0c;还有另外一种更通用的机制也可以实现同样的目的&#xff0c;这就是迭代器&#xff08;iterator&#xff09;。在第II部分中将要介绍&#xff0c;除了vector之外&#xff0c…

英语口语-文章朗读Week9 TuesDay

朗读文章 People living in ancient times had no alternative but to do housework manually. They fire the wood when they cook,they hand wash clothes with hands; they sweep the floor with brooms. Now, modern inventions come as a great relief to people. We co…