当前位置: 首页 > news >正文

C++基础语法:STL之容器(1)--容器概述和序列概述

前言

       "打牢基础,万事不愁" .C++的基础语法的学习

引入 

        STL是标准模板库,类模板主要是用来做容器的,所以个人理解:标准模板库是"标准容器库".容器是STL的核心 .以<C++ Prime Plus> 6th Edition(以下称"本书")内容理解容器.

类模板内容回顾

         类模板把数据类型---class类型或基本类型作为参数传入,设类型为T,则可以把T*(指针),T**(双重指针), T a[](数组)作为类模板属性

容器概念

        本书内容解读

        写在前面的话:本节所有的"容器"都要替换成"STL容器"去理解.

        1>本书P695第三段."它是一个概念化的抽象基类,是因为容器类并不真正使用继承机制,换句话说,容器概念指定了所有STL容器类都必须满足的一系列要求"

        ----是抽象基类,但不真正使用继承机制,读起来还是很拗口.既然他不要求继承,就不要想继承吧,问题不大.容器概念指定了所有STL容器类都必须满足的一系列要求.估计所有STL容器类都定义了Iterator迭代器作为内部类,算一种表现.C++基础语法:STL之迭代器-CSDN博客

         2>第四段:容器是存储其他对象的对象。被存储的对象必须是同一种类型的,它们可以是OOP意义上的对象,也可以是内置类型值。存储在容器中的 数据为容器所有,这意味着当容器过期时,存储在容器中的数据也将过期(然而,如果数据是指针的话,则它指向的数据并不一定过期)

         ----容器的概念:存储其他对象的对象.被存储对象必须是同一类型,是OOP对象,内置类型,指针类型都可以.

        3>第五段:不能将任何类型的对象存储在容器中,具体地说,类型必须是可复制构造的和可赋值的。基本类型满足这些要求;只要类定义没有将复制构造函数和赋值运算符声明为私有或保护的,则也满足这种要求。 C++11改进了这些概念,添加了术语可复制插入(CopyInsertable)和可移动插入(MoveInsertable),但这里只进行简单的概述

        ----class类型(类类型),有默认复制构造函数和赋值构造函数,也没有放在私有或保护空间(否则在类作用域外无法调用,如在main函数里不能使用 SomeType a=b;),所以没有问题.

        在表16.5 "一些基本容器特征"中,提供了"所有容器都提供某些特征和操作".这里有个问题:所有容器是指STL容器,不包括自定义容器(按上面标题1>所述,应该指STL容器).vector<vector<int> >是允许的,如果自定义一个容器叫element,那么vector<element<int> >是否能用?留待验证.

        4>第六段:所有容器都提供的某些特征和操作.

         ----a和b表示类型为X的值;u表示类型为X的标识符.实际上都表示容器类对象,a和b为已初始化的对象,而u表示尚未初始化的对象.

        时间复杂度:编译时间快于固定,固定快于线性时间.理解:线性时间需要访问容器里每一个元素

        本书P696中"C++新增的基本容器要求" 用到非常量右值,暂不说明

==============================内容分割线================================== 

        注意:区分STL容器和自定义容器.自定义容器是自己拿类模板定义的, 除了自身定义的api,不能调用表格16.5内的api.严格的说:容器是指STL按照类模板定义的数据集合类."自定义容器"是自定义的类模板,存放某一种数据类型的数据集合的类.

        "容器"是一种概念,并且被STL模板库所实现,要想使用容器,就必须遵守他的规定.例如:类型必须是可复制构造的和可赋值的.---是对于容器的说明,在上面标题3>

        .假设建立一个vector<vector<int> >.如果自己也定义一个容器elem,不给他定义elem(const elem&)//复制构造函数和elem operator=(const elem&)//赋值构造函数,那么vector<elem<int> >这个容器建立不起来,或者调用表格api会出问题.  而本书P613的queuetp.h中的QueueTP可以做.建立一个vector<QueueTP<int> >.笔者目前没有试过,这段话属于假设.

        能不能让自定义容器调用16.5里的api呢,因为容器没有继承机制,如果能进入容器底层(编译器?)或许可以,但这已经超出本书学习范围了.如果所用的容器算法不太够用,可以针对容器类对象,用C++间接开发.

class SecondDevelopment{vector<string> strings; //vector对象传入类SecondDevelopment  
public:etc;                //其他,用对象函数处理strings
}

==============================内容分割线==================================  

 序列

        本书内容解读 

        STL容器进行了分类,其中序列是其中一个种类,特点是序列元素有确定的顺序.

        1>本书P697第二段:序列还要求其元素按严格的线性顺序排列,即存在第一个元素、最后一个元素,除第一个元素和最后一个元素外,每个元素前后都分别有 一个元素。数组和链表都是序列,但分支结构(其中每个节点都指向两个子节点)不是

         ----数组和链表比较熟悉了, 分支结构指的是结点有两个以上子结点的,比如数据结构中的"二叉树",他有左结点和右结点,在每个结点后面可以往两个方向走.       

        2>表16.7的说明        

        序列类容器的通用函数,整体来说,内容包括:生成序列容器类对象,插入,删除

a.clear()   //清空序列容器

        另外表达式中有用迭代器对象做形参的地方,按照容器的通用方法,只有begin()和end()是明确能返回首元素迭代器和超尾迭代器.其他地方的迭代器需要求出来.方法和指针一样,例如:

/*伪代码*/
//有序列容器sequence,容器内元素类型T,序列容器对象object;
sequence<T> object;  sequence::iterator findIterator(T val){         //查找T类型值所在迭代器   
sequence<T>::iterator ptr;                      //声明迭代器对象;不写可以让编译器推断;
for(ptr=object.begin();ptr!=object.end();ptr++){if(*ptr=val)return ptr;}
}   

        本书P697第一段:序列概念增加了迭代器 至少是正向迭代器这样的要求,这保证了元素将按特定顺序排列,不会在两次迭代之间发生变化.----序列用至少正向迭代器,所以支持"ptr++"和"*Ptr"

        这段代码的场景是求出某个值所在迭代器,让后传入insert函数或者erase函数中使用

        3>表16.8说明

        序列类容器的专用函数,整体来说,内容包括:插入,删除,查找

        注意:可选的序列函数是哪些容器能使用.

        用a[n]查找容器内元素的两个容器vector和deque,说明用的是随机访问迭代器

        常用的push_back()函数,插入序列容器末尾.

小结

        区别STL容器和自定义容器.

        可以从迭代器的"纠结"中解放出来了.STL容器将迭代器使用大大简化了.迭代器也是为了函数而产生的,api在那里,程序员直接调用,不用管迭代器到底干了什么. 

        迭代器既是实现也是一种概念,从使用者的角度来说,他增加了"统一性"的同时也增加了类模板的复杂程度.但最值得肯定的一点,程序员从中得到启发.尝试自己概念设计和实现.

        STL容器简化了编程,降低了灵活度并制定了使用规则.自定义容器灵活度高,但从头做起难度会高一些.使用首选STL容器,有对容器感兴趣的,可以自己尝试容器设计,参考黑皮书<C++编程思想>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 「Python」基于Gunicorn、Flask和Docker的高并发部署
  • 人像视频预处理【时间裁剪+画面裁切+调整帧率】
  • 工业三防平板可优化工厂流程管理
  • Redis--布隆过滤器
  • Windows与Linux双机热备软件推荐
  • 设计模式使用场景实现示例及优缺点(行为型模式——命令模式)
  • Mac安装stable diffusion 工具
  • 封装网络请求 鸿蒙APP HarmonyOS ArkTS
  • 把关键字当作列名 不报错的方法 (数据库)
  • 大数据技术基础
  • Laravel表单验证的艺术:精细控制数据的入口
  • React遍历tree结构,获取所有的id,切换自动展开对应层级
  • Ajax从零到实战
  • Log4j的原理及应用详解(三)
  • 在GPU上运行PyTorch
  • ComponentOne 2017 V2版本正式发布
  • ES6语法详解(一)
  • HashMap ConcurrentHashMap
  • Median of Two Sorted Arrays
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 近期前端发展计划
  • 那些被忽略的 JavaScript 数组方法细节
  • 无服务器化是企业 IT 架构的未来吗?
  • 从如何停掉 Promise 链说起
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #QT(QCharts绘制曲线)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)SvelteKit教程:layout 文件
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四) 虚拟摄像头vivi体验
  • (算法)Game
  • (转)我也是一只IT小小鸟
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net core + vue 搭建前后端分离的框架
  • .net core控制台应用程序初识
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 验证控件和javaScript的冲突问题
  • .NET6 命令行启动及发布单个Exe文件
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET轻量级ORM组件Dapper葵花宝典
  • @angular/cli项目构建--Dynamic.Form
  • @ModelAttribute使用详解
  • @selector(..)警告提示
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [20161214]如何确定dbid.txt