到底什么是“容器适配器”?

2023-11-07

首先,我们要明白适配器是干什么的?其实就是一个接口转换装置,是得我们能用特定的方法去操作一些我们本来无法操作的东西。举一个例子,比如你的一个设备支持串口线,而你的电脑支持的是usb口,这时候,我们没有必要重新买一个支持usb的设备,只需要一根串口转usb口的小玩意,让你的设备能够连接到usb插口上,而它就是适配器。

容器适配器到底是什么意思?

不同场景下,由于不同的序列式容器其底层采用的数据结构不同,因此容器适配器的执行效率也不尽相同。但通常情况下,使用默认的基础容器即可。当然,我们也可以手动修改,具体的修改容器适配器基础容器的方法,请详看下面自定义Stack类演示:

以Stack为例,容器适配器的意思就是底层使用的容器不同,以Stack使用vector数组为例:

Person.h

#pragma once  
  
#include <iostream>  
#include <sstream>  
#include <string>  
using namespace std;  
  
class Person  
{  
private:  
    string name;  
    int age;  
public:  
    Person() = default;  
    Person(int age, string name);  
    Person(const Person& obj);  
    Person(Person&& obj);  
  
    Person& operator = (Person obj);  
    friend ostream& operator << (ostream& cout, Person& obj);  
  
    ~Person() = default;  
};  

 

Person.cpp

#include "Person.h"  
  
Person::Person(int age, string name)  
{  
    this->age = age;  
    this->name = name;  
}  
  
Person::Person(const Person & obj)  
{  
    this->age = obj.age;  
    this->name = obj.name;  
}  
  
Person::Person(Person && obj)   
{  
    this->name = obj.name;  
    this->age = obj.age;  
}  
  
Person & Person::operator=(Person obj)  
{  
    this->age = obj.age;  
    this->name = obj.name;  
    return *this;  
}  
  
ostream & operator<<(ostream & cout, Person & obj)  
{  
    cout << obj.name << "的年龄为" << obj.age;  
    return cout;  
}  

在这里我们一定要注意:拷贝构造函数的形式:一定要将拷贝构造成员函数定义为const属性的

Main.cpp

#include "Stack.hpp"  
#include "Person.h"  
#include <iostream>  
#include <string>  
using namespace std;  
  
int main()  
{  
    Person Person_Obj1(19, "张三");  
    Stack<Person> Stack_Obj1;  
    Stack_Obj1.Push(Person_Obj1);  
    Stack_Obj1.ShowInf();  
}  

 

Stack.hpp

#include <iostream>  
using namespace std;  
#include <vector>  
#include <exception>  
#include <algorithm>  
  
template <class T>  
class Stack  
{  
private:  
    vector<T> element;  
public:  
    Stack() = default;  
    Stack(T obj);  
    Stack(vector<T> element);  
    Stack(Stack& obj);  
  
    void Push(T obj);  
    void Pop();  
    T Top();  
    void ShowInf();  
  
    ~Stack() = default;  
};  
  
template<class T>  
inline Stack<T>::Stack(T obj)  
{  
    this->element.push_back(obj);  
}  
  
template<class T>  
inline Stack<T>::Stack(vector<T> element)  
{  
    this->element = element;  
}  
  
template<class T>  
inline Stack<T>::Stack(Stack& obj)  
{  
    this->element = obj.element;  
}  
  
template<class T>  
inline void Stack<T>::Push(T obj)  
{  
    this->element.push_back(obj);  
}  
  
template<class T>  
inline void Stack<T>::Pop()  
{  
    if (this->element.empty())  
    {  
        throw out_of_range("empty stack");  
    }  
    this->element.pop_back();  
}  
  
template<class T>  
inline T Stack<T>::Top()  
{  
    if (this->element.empty())  
    {  
        throw out_of_range("empty stack");  
    }  
    return *(this->element.begin());  
}  
  
template<class T>  
inline void Stack<T>::ShowInf()  
{  
    if (this->element.empty())  
    {  
        throw out_of_range("empty stack");  
    }  
    for_each(this->element.begin(), this->element.end(), [](T& obj) {cout << obj << " "; });  
    cout << endl;  
}  

 

我们看到我们可以使用vector作为Stack栈的底层容器进行各项操作,这是依据Stack属性而言的,比如:我想频繁的入栈和出栈我们可以选择vector容器,Stack出栈入栈本质上来说就是在vector数组尾部删除插入元素。

但是queue队列就不一样了,queue是先入先出即从数组第一个元素前面插入元素,在最后一个末尾元素删除元素,这样的操作显然deque容器最为适合。

我们根据选择不同的底层容器来进行程序性能的提高,这就是容器适配器的作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

到底什么是“容器适配器”? 的相关文章

  • InvalidOperationException - 对象当前正在其他地方使用 - 红十字

    我有一个 C 桌面应用程序 其中我连续创建的一个线程从源 实际上是一台数码相机 获取图像并将其放在 GUI 中的面板 panel Image img 上 这必须是另一个线程 如它是控件的代码隐藏 该应用程序可以工作 但在某些机器上 我会在随
  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • Ubuntu16.04 64位系统下面安装JDK1.7

    1 去到官网下载jdk 点击打开链接 2 安装WinSCP工具连接到linux系统上面在 usr lib里面新建一个jvm文件夹 然后把下载的jdk 7u79 linux x64 tar gz上传到jvm里面 3 解压刚上传的jdk 7u7
  • 计算机视觉的定义,应用及整个系统

    定义 计算机视觉是使用计算机及相关设备对生物视觉的一种模拟 它的主要任务就是通过对采集的图片或视频进行处理以获得相应场景的三维信息 就像人类和许多其他类生物每天所做的那样 计算机视觉是一门关于如何运用照相机和计算机来获取我们所需的 被拍摄对
  • Linux查看当前目录下文件及文件夹的大小

    使用场景 查看服务器磁盘空间使用情况 快速定位当前目录下的大文件夹 快速找出大文件 推荐一个比较好用的命令 du h max depth 1 当前参数讲解 h 以可读性较好的方式显示尺寸 例如 1K 1M 1G max depth N 显示
  • objc学习笔记-基础

    1 xcode 4 3 3以后 NSAutoreleasePool 的用法发生改变 由 NSAutoreleasePool pool NSAutoreleasePool alloc init pool drain 变为 autoreleas
  • MySQL的分片(一)——分布式数据库概述

    系统分析 OLAP or OLTP 在互联网时代 海量数据的存储与访问成为系统设计与使用的瓶颈问题 对于海量数据处理 按照使用场景 主要分为两种类型 联机事务处理 OLTP 和联机分析处理 OLAP 联机事务处理 OLTP 也称为面向交易的
  • Typora+PicGo+GitHub搭建免费图床

    准备工作 Typora官网 PicGo官网 PicGo Core配置文件 Github 或Gitee Github准备图床仓库 新建一个仓库 仓库一定要设置为public公共仓库 生成私人令牌 Github主页右上角点击用户头像 gt Se
  • 课程2:《黑马程序员_Java基础视频-深入浅出精华版》-视频列表-

    day01 avi 01 01 计算机基础 计算机概述 avi day01 avi 01 02 计算机基础 计算机硬件和软件概述 avi day01 avi 01 03 计算机基础 软件开发和计算机语言概述 avi day01 avi 01
  • 用数学思想演绎的一些系统概念

    在这一部分要给出系统的数学定义 因为公式编辑器有时候不太好用 所以尽量简化 系统的定义 增长 竞争 整体 和 机械化 中心化 最终形态 最终形态的类型 学科中的同构 学科的联合 1 系统的定义 系统的数学定义如下 系统是由元素 元素之间相互
  • ip route 路由命令详解

    523条消息 ip route 命令详解 thj blog的博客 CSDN博客 ip route命令详解 Linux如何查看网关地址 study goup 博客园 cnblogs com 添加路由192 20 30 0 24网段走eth0网
  • python接口自动化测试视频教程百度云全集_python自动化运维测试框架实战视频教程百度云资源...

    python自动化运维测试框架实战视频教程百度云资源 web app 接口自动化 自动化框架 课程目录 开学典礼 上 开学典礼 下 python基础 Python入门 预习视频 python基础 对象与变量 预习视频 python基础 字符
  • Visio里Mathtype公式变形问题解决

    直接从word或者ppt复制MathType公式到Visio里可能会发生公式的变形 查找了一下解决办法 记录一下 建议不要只要从其他office软件直接复制过来 第一步 找到Visio工具栏的插入 然后选择对象 双击插入就可以了 后面的其他
  • QT5背景图片不显示的问题解决方法

    将qt creator左栏的项目 gt 概要 gt shadow build里的勾去除 使生成的debug文件放在源代码目录下 问题就解决了 更多绿色版本软件及机器视觉学习资料 请关注关注公众号 机器视觉智能解决方案
  • 5. 模块化编程

    HI 大家好 我是茶桁 上一节中我们学习了Python基本的流程控制 并且预告了这一节的内容 就是将要学习 模块化编程 那什么是模块化编程呢 按照维基百科的说法 模块化编程 英语 modular programming 是强调将计算机程序的
  • 军品研制过程介绍

    对于新入军品这个行业的新人来说 很难找到一个标准 或者程序等 将整个军品研制过程描述展示出来 本文章将系统性的讲述整个研制过程 一 军品研制过程 军品研制过程分为以下几个过程 可参照GJB 3273 论证阶段 L 技术性能指标可行性论证 方
  • C++访问限定符private、public、protected的使用场景

    众所周知 C 中有3种访问符 分别是private public protected 其中private和public比较好理解 private 只能由该类中的函数 其友元函数访问 不能被任何其他访问 更不能由该类的对象在类外进行访问 类成
  • 软件连接设置_丰田Techstream软件初探(刷一键升窗)

    前面通过我介绍 丰田Mini vci J2534检测线在64位系统安装 不少同学已经购买了J2534数据线 并在64位系统下安装成功了 如安装不成功 可以通过公众号的文字输入栏 发文字给我 我尽量及时解答 今天给大家聊聊如何使用丰田Tech
  • 功能测试基础之界面测试

    功能测试基础之界面测试 文章目录 功能测试基础之界面测试 前言 一 易用性 简述 易用性细则 二 规范性 简述 规范性细则 三 合理性 简述 合理性细则 四 美观与协调性 简述 美观与协调性细则 五 菜单位置 简述 菜单测试细则 六 独特性
  • JSP页面UTF-8格式中文字符串乱码问题解决方法

    JSP页面使用utf8格式保存中文字符串到文件或进行socket传送接收数据时 常常会出现乱码 这里给出了一个解决方法 实践检验行之有效 0 页面属性设置
  • 在linux shell中使用ftp命令来实现自动登陆、上传与下载

    前段时间有个需求 需要利用crontab定时往某个FTP上传文件 原以为linux中带的ftp命令只支持交互式的操作 没法在命令行下使用 所以后来打算利用PHP中提供的ftp命令来做 但是很不幸的发现ftp模块不是PHP的标准模块 还需要自
  • 到底什么是“容器适配器”?

    首先 我们要明白适配器是干什么的 其实就是一个接口转换装置 是得我们能用特定的方法去操作一些我们本来无法操作的东西 举一个例子 比如你的一个设备支持串口线 而你的电脑支持的是usb口 这时候 我们没有必要重新买一个支持usb的设备 只需要一