C++容器适配器的概念与示例

目录
  • 一. 什么是适配器与容器适配器?
  • 二. 理解容器适配器
    • stack的模拟实现
    • queue的模拟实现

一. 什么是适配器与容器适配器?

适配器是一种设计模式(设计模式是一套被反复使用的,多数人知晓的,经过分类编目的,代码设计经验的总结),该种模式将一个类的接口转换成用户需要的另外一个接口。

举个例子:在日常生活中,当手机没电了,我们需要给手机充电,给手机充电的方式很多,可以插到电源上,也可以用充电宝,还可以直接连着电脑充。而我们并不关心用什么给它充电,我们关心的只是能否给手机充上电。适配器充当的角色就是 给手机充电的接口,它会将不同大小的电压转化成适合给手机充电的电压。容器适配器的概念可以结合这个例子理解,它以 某种容器作为底层结构,改变其接口,使它符合该容器的特性。

容器适配器:以某种已有的既定容器作为底层结构,在其基础上进一步地进行封装接口函数。使其可以满足某种特性。

下面将介绍三个用到容器适配器的结构:stack栈,queue队列,priority_queue优先级队列,通过这三个结构,我们可以更好的理解容器适配器的用途。

二. 理解容器适配器

STL的六大组件

我们可以看出虽然stack,queue,priority_queue中也可以存放数据,但在STL中并没有将其划分在容器的行列,而是将其称为容器配接器,这是因为stack,queue,priority_queue只是对其它容器的接口进行了包装,STL中stack和queue默认使用deque,priority_queue默认使用vector作为容器。我们现在来看看它们的底层接口和实现

stack的模拟实现

知道了容器适配器后,stack的模拟实现就简单了,我们只需要调用指定容器deque的各个成员函数即可实现stack的各个函数接口。

底层实现代码如下:stack底层利用deque双端队列进行包装,需要更改成多参数模板,最便利的一点就是,stack的底层函数的实现可以直接调用容器的函数接口,不需要自己再一步步实现。

namespace nn //命名空间域:防止命名冲突
{
    //多参数模板
	template<class T, class Container = std::deque<T>>//可以明显看出stack配接器的底层容器是deque双端队列,后面会介绍
	class stack
	{
	public:
		//元素入栈
		void push(const T& x)
		{
			_con.push_back(x);
		}
		//元素出栈
		void pop()
		{
			_con.pop_back();
		}
		//获取栈顶元素
		T& top()
		{
			return _con.back();
		}
		const T& top() const//const修饰
		{
			return _con.back();
		}
		//获取栈中有效元素个数
		size_t size() const
		{
			return _con.size();
		}
		//判断栈是否为空
		bool empty() const
		{
			return _con.empty();
		}
		//交换两个栈中的数据
		void swap(stack<T, Container>& st)//注意stack<T,Container>才是类型,加引用,别名,减少拷贝
		{
			_con.swap(st._con);//调用deque的算法swap
		}
	private:
	    //deque<T> _con底层
		Container _con;//将一个类的接口转换成用户需要的另一种接口,即利用deque容器转换成stack配接器
	};
}

queue的模拟实现

同样的方式,我们也是通过调用所指定容器的各个成员函数来实现queue的。

底层实现代码如下:

namespace nn //防止命名冲突
{
	template<class T, class Container = std::deque<T>>
	class queue
	{
	public:
		//队尾入队列
		void push(const T& x)
		{
			_con.push_back(x);
		}
		//队头出队列
		void pop()
		{
			_con.pop_front();
		}
		//获取队头元素
		T& front()
		{
			return _con.front();
		}
		const T& front() const
		{
			return _con.front();
		}
		//获取队尾元素
		T& back()
		{
			return _con.back();
		}
		const T& back() const
		{
			return _con.back();
		}
		//获取队列中有效元素个数
		size_t size() const
		{
			return _con.size();
		}
		//判断队列是否为空
		bool empty() const
		{
			return _con.empty();
		}
		//交换两个队列中的数据
		void swap(queue<T, Container>& q)
		{
			_con.swap(q._con);
		}
	private:
		Container _con;//deque<T> _con;
	};
}

思考stack 和 queue 是否存在迭代器?

stack 和 queue 都不具备迭代器, 因为两者都不具备遍历走访功能,所以自然不需要设计迭代器

stack 和 queue可以以哪些容器作为底层容器?

实际上stack使用vector作为底层容器也是可以的,queue使用deque双端队列+list带头双向循环链表作为底层容器也是可以的。

但是deque在设计上相比于list和vector,作为stack,queue的底层结构更优。

底层容器如何传进去?

作为模板参数传入template<class T,class Container = deque<T>>,用了默认参数(缺省参数)

到此这篇关于C++容器适配器的概念与示例的文章就介绍到这了,更多相关C++容器适配器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ STL中的容器适配器实现

    1 stack 1.1 stack 介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作.back:获取尾部元素操作.pus

  • C++ 容器适配器priority_queue的使用及实现代码

    优先级队列(Priority Queue) 队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素.但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素,这种队列就是优先级队列(Priority Queue),也称为优先权队列. 1. 优先级队列的概念 优先级队列的定义 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. 优先级队列的特点 优先级队列是0个或多个元素的集合,每个元素都有一个优先权或值. 当给每个元素分配

  • C++ STL容器适配器使用指南

    目录 适配器 stack容器适配器 ️stack的介绍 ️stack的使用 ️stack的模拟实现 queue ️queue的介绍 ️queue的使用 ️queue的模拟实现 deque容器 priority-queue ️priority-queue的使用 ️priority-queue的模拟实现 适配器 适配器是一种设计模式(设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口.例如: 容器适配器让一种已存在的容

  • C++容器适配器的概念与示例

    目录 一. 什么是适配器与容器适配器? 二. 理解容器适配器 stack的模拟实现 queue的模拟实现 一. 什么是适配器与容器适配器? 适配器是一种设计模式(设计模式是一套被反复使用的,多数人知晓的,经过分类编目的,代码设计经验的总结),该种模式将一个类的接口转换成用户需要的另外一个接口. 举个例子:在日常生活中,当手机没电了,我们需要给手机充电,给手机充电的方式很多,可以插到电源上,也可以用充电宝,还可以直接连着电脑充.而我们并不关心用什么给它充电,我们关心的只是能否给手机充上电.适配器充

  • Flutter 容器盒子模型的使用示例

    在讲 Flutter 的盒子模型前,先看看HTML 中的盒子模型.如下图所示,一个页面元素包括了与父级容器的外边距(margin),自身内容与边框的内边距(padding).外边距 和内边距都可以通过 LTRB (左.上.右.下)单独设定四个方向的大小. Flutter 的盒子模型和 HTML 的是一样的,而通用的容器 Container 就相当于是一个通用的容器,和 HTML 的 div 标签一样.如果要控制一个元素的尺寸,外边距,内边距和边框,最通用的做法是使用 Container 容器将元

  • JavaScript中的ajax功能的概念和示例详解

    AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML). 个人理解:ajax就是无刷新提交,然后得到返回内容. 对应的不使用ajax时的传统网页如果需要更新内容(或用php做处理时),必须重载整个网页页面. 示例: html代码如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>

  • c++ 结构体内存对齐基本概念及示例

    基本概念: 各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数, 各成员变量在存放的时候根据在结构中出现的顺序依次申请空间 同时按照上面的对齐方式调整位置. 空缺的字节自动填充, 同时为了确保结构的大小为结构的字节边界数(即该结构中占用最大的空间的类型的字节数)的倍数,所以在为最后一个成员变量申请空间后 还会根据需要自动填充空缺的字节: 举例说明: #include <iostream> using namespace std; #pragma pack

  • Docker容器的使用方法简单示例

    目录 一.拉取镜像 二.运行镜像 三.测试容器内的应用 四.检查宿主机端口 五.停止容器 一.拉取镜像 1.检测镜像是否存在 [root@node1 ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 15187 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker con- 2

  • Docker容器编译LNMP的实现示例

    目录 一. 项目描述 二. Nginx镜像制作 三. Mysql镜像制作 四. PHP镜像制作 五. 运行LNMP 六. 网页查看 一. 项目描述 使用Docker容器基于centos镜像分别制作nginx镜像,mysql镜像和php镜像使用编译安装的方式,最后通过镜像启动成容器时使用container模式网络模式并访问到php测试页面 二. Nginx镜像制作 //拉取centos镜像 [root@Docker ~]# docker pull centos Using default tag:

  • python目标检测IOU的概念与示例

    目录 学习前言 什么是IOU IOU的特点 全部代码 学习前言 神经网络的应用还有许多,目标检测就是其中之一,目标检测中有一个很重要的概念便是IOU 什么是IOU IOU是一种评价目标检测器的一种指标. 下图是一个示例:图中绿色框为实际框(好像不是很绿……),红色框为预测框,当我们需要判断两个框之间的关系时,需要用什么指标呢? 此时便需要用到IOU. 计算IOU的公式为: 可以看到IOU是一个比值,即交并比. 在分子部分,值为预测框和实际框之间的重叠区域: 在分母部分,值为预测框和实际框所占有的

随机推荐