尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

queue stack

queue stack 之前我们这样模拟栈一、了解适配器迭代器也是一种设计模式以下是库中栈和对列栈性质是某容器支持在容器一端栈顶插入删除数据就可以所以用vectorT和listT容器实现封装成栈都行我们用vector封装模拟实现栈但就定死了只能是vectorT我们还想换listT即传不同的容器由此诞生 Container容器适配器。Container就是容器适配器意思是可以传任意的容器类型所以我们如下图这样用容器适配器模拟栈(库内的栈和我们模拟实现的方式大体一样)因为Container传的是标准库内的模板vectorT或listT所以对象_con可以用标准库内对应模板的所有相关内容成员函数等等模拟实现栈时直接调能用的相关内容即可二、栈模拟实现因为栈和队列的模拟都是模拟实现模板所以只有两个文件一个.cpp 一个.h不用写栈的构造函数 将容器尾部当作栈顶 直接调能用的相关内容_con.back源于取首尾函数三、模拟完成后栈的使用给模板形参传的是类型给函数形参传的是值、对象这里我们给class Container的默认适配是vectorTdequeT稍后讲模拟完成后栈的使用如下下、下下下图。1. .h文件没有包任何头文件为什么vectorT能用程序能正常运行编译器编译时第一步会进行预处理将.h中的代码在.c或.cpp文件中黏贴过去不会实例化只做语法基础检查会自动向上寻找展开内容所需类型或变量默认不会到std里找不会向下寻找。因为在.cpp文件中包含了.h需要用到的所有头文件所以虽然模拟实现栈的.h中无头文件但是在.cpp中展开后向上寻找后依然能找到所需的vector头文件。2. 但是如果是下图代码仍然通过为什么因为VS 的iostream内部间接包含了vector。预处理展开#includeiostream的时候顺带把 vector 的声明带进编译环境等后面处理Stack.hvector名字已经可见。但这不是标准行为g 下这样写直接报错GCC 版本的iostream不会间接包含 vector。若VS 升级、STL 内部改动代码可能随时失效。3.当.h文件中有直接使用cout cin如下左图像如下右图包含.h文件时会报错。在.c中包含头文件.h的那句代码要写在using namespace std后面因为黏贴过来后向上寻找虽然.cpp包了iostream但是没有using namespace std无法直接使用cout cin仍然报错。综上要包含的.h文件的代码写在包含头文件和using namespace std这两者的代码后面3.按需实例化调用实例化哪些比如成员函数就仔细检查哪些当我们函数内错接口时如果不调用对应函数就不会报错。一旦调用如下图就报错。编译器对不调用的内容只会检查基本框架语法。
返回列表