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,一经查实,立即删除!

相关文章

codeforces 236A-C语言解题报告

236题目网址 题目解析 1.输入字符串,判断其中不同的字符个数,奇偶输出不同的语句 2.使用冒泡排序去排序,当遇到s[k]!s[k1]时进行计数 代码 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() {char s [100]{\0};int i,j,k,count0;cha…

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;会发现多了一个…

codeforces 96A-C语言解题报告

96A题目网址 题目解析 1.输入0和1表示不同队的队员字符串,如果7个及以上的一个0或1在一起,则输出YES否则输出NO 举例: 输入: 1000000001 输出: YES 2.循环时,当遇到count7时输出YES并跳出循环,遇到s[i]!s[i1]时,将count重置为1,最后count<7再输出NO 代码 #include<s…

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…

MySQL 客户端命令

文章目录1、连接命令2、断开连接3、命令结束符4、查看所有数据库5、切换到指定数据库6、查看当前使用的数据库7、查看库中所有表8、查看所有用户9、执行SQL脚本10、查询当前时间1、连接命令 首先定位到MySQL安装根目录/bin目录下&#xff0c;然后执行如下命令&#xff1a; my…

SQL 库、表语句

文章目录一、数据库操作1、创建数据库2、删除数据库二、表操作1、创建表&#xff08;1&#xff09;主键&#xff08;primary key&#xff09;属性&#xff08;2&#xff09;unique属性&#xff08;3&#xff09;主键和unique约束的区别&#xff08;4&#xff09;外键&#xff0…

codeforces 69A-C语言解题报告

69A题目网址 题目解析 1.输入n个(x,y,z),当xi相加0;yi相加0;zi相加0同时时输出YES,否则输出NO 举例: 输入: 3 3 -1 7 -5 2 -4 2 -1 -3 输出: YES 2.注意点:使用二维数组去存放时,使用遍历行并对每一列分别相加 for(b0;b<n;b){count_xdir[b][0];count_ydir[b][1];count_z…

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

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

SQL 查询语句

文章目录1、简单查询2、去除单列的重复结果查询3、去除多列的重复结果查询4、限制查询结果条数5、对查询结果排序&#xff08;1&#xff09;按照单个列的值进行排序&#xff08;2&#xff09;按照多个列的值进行排序6、带搜索条件查询&#xff08;1&#xff09;简单搜索条件查询…

2000年考研英语阅读理解文章一

文章详细讲解网址 注意点 1.文章开篇第一句话往往是文章所想要通过后面讲解的事情表达出来的最终观点 2.当询问到作者观点时,往往在最后一段,一般以下形式呈现: 1)few people …(这就是作者的观点) 2)I think 后面举什么别人所说的话,如果不是表达了赞同,则都是别人的观点,而…

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

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

codeforces 546A-C语言解题报告

546A题目网址 题目解析 1.输入 k(成本),n(拥有的钱),w(要买的个数),输出还需要向朋友借多少钱? 举例: 输入: 3 17 4 输出: 13 2.注意: 1)第i个,需要i*k个价钱,所以需要使用for循环运算花费 2)当拥有的钱足够买时,不需要借钱,输出为0 代码 #include<stdio.h> #inclu…

java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误

文章目录1、报错信息2、原因分析3、解决方案1、报错信息 java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游标的最大数 ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游标的最大数 ORA-01000: 超出打开游标的最大数at oracle.jd…

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

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

codeforces 791A-C语言解题报告

791A题目网址 题目解析 1.输入a,b,每一年a3;b2,问多少年a>b? 2.因为不知道需要循环多少次,使用while循环 代码 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() {int a,b,i0;scanf("%d %d",&a,&b);while(a&l…

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;元素是关键字_值…

codeforces 977A-C语言解题报告

977A题目网址 题目解析 1,输入数字n,运算次数k,当n最后一个数字是0时,n/10;当n最后一个数字不是0时,n-1;输出n 举例: 输入: 512 4 输出: 50 2.注意:当n最后一个数字是0时,使用n%100去判断 代码 #include<stdio.h> #include<stdlib.h> #include<string.h>…