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++编程思想>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/46080.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/46080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NineData全面支持PostgreSQL可视化表结构设计

“PostgreSQL 是最像 Oracle 的开源关系型数据库“&#xff0c;也正因为如此&#xff0c;很多企业都青睐 PostgreSQL&#xff0c;拿它当成 Oracle 的替代品。所以毫无疑问&#xff0c;目前 PostgreSQL 在企业中非常常见。 对于直接接触 PostgreSQL 的开发人员而言&#xff0c;…

echarts多柱堆叠的X轴顺序

在一些图表场景中&#xff0c;需要显示多柱堆叠的数据&#xff0c;那么X轴上每一段单位区域内会有多根柱子&#xff0c;每一根柱子标识不同的数量项含义&#xff0c;那么怎样控制这几根柱的左右顺序呢&#xff1f; 其实这跟echarts的option里的series由关&#xff0c;开始我以为…

快速排序及归并排序的实现与排序的稳定性

目录 快速排序 一. 快速排序递归的实现方法 1. 左右指针法 步骤思路 为什么要让end先走&#xff1f; 2. 挖坑法 步骤思路 3. 前后指针法 步骤思路 二. 快速排序的时间和空间复杂度 1. 时间复杂度 2. 空间复杂度 三. 快速排序的优化方法 1. 三数取中优化 2. 小区…

实验丰富、原创改进!|多策略改进蜣螂优化算法(MATLAB)

本文内容来源于本人公众号&#xff1a;KAU的云实验台&#xff0c;更新内容&#xff1a;智能优化算法及其改进应用。 本文核心内容&#xff1a; 新颖的多策略改进蜣螂优化算法 对比算法包括&#xff1a;高引用/新发布/经典/其他DBO变体&#xff08;共11种&#xff09; 实验设计…

用c语言写一个贪吃蛇游戏

贪吃蛇游戏通常涉及到终端图形编程和简单的游戏逻辑。以下是一个基本的实现示例&#xff0c;包括贪吃蛇的移动、食物生成、碰撞检测等功能。 1. 贪吃蛇游戏的基本结构 贪吃蛇游戏可以分为以下几个部分&#xff1a; 游戏地图和终端绘制&#xff1a;使用二维数组表示游戏地图&am…

SpringBoot结合ip2region实现博客评论显示IP属地

你好呀&#xff0c;我是小邹。 在现代的Web应用中&#xff0c;特别是博客和论坛类网站&#xff0c;为用户提供地理定位服务&#xff08;如显示用户所在地理位置&#xff09;可以极大地增强用户体验。本文将详细探讨如何使用Java和相关技术栈来实现在博客评论中显示用户的地址信…

Java实验3

实验内容 学生信息管理系统 学生成绩表Student(Sno 字符串&#xff0c;长度9, Sname 字符串&#xff0c;长度10, Class 字符串&#xff0c;长度10, Age 整型, Sex 字符串&#xff0c;长度2) 实现如下功能&#xff1a; A&#xff0e;输入若干个学生的信息到Student表&#x…

初学Python必须知道的14个强大单行代码

引言&#xff1a;Python的魅力与单行代码的重要性 Python以其简洁明了的语法、丰富的内置函数和强大的第三方库深受广大开发者喜爱。尤其对于编程小白来说&#xff0c;学习Python就像打开了一扇通向编程世界的大门。而单行代码&#xff0c;作为Python魅力的一部分&#xff0c;…

【NetTopologySuite类库】合并所有几何的包围盒AABB

流程示意图 示例代码 using GeoAPI.Geometries; using Microsoft.VisualStudio.TestTools.UnitTesting; using NetTopologySuite.Geometries; using NetTopologySuite.IO; using System.Collections.Generic; using System.Linq;namespace Test472 {[TestClass]public class T…

深度解析:电商订单API及其技术实现

随着电子商务的发展&#xff0c;实体企业开拓电商渠道的越来越多&#xff0c;原有的管理系统都需要增加电商业务管理功能&#xff0c;其中&#xff0c;对电商订单的管理是每一个电商商家都需要的功能&#xff0c;所以对于开发者来说&#xff0c;了解电商API是什么是非常重要的&…

第100+16步 ChatGPT学习:R实现Xgboost分类

基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言&#xff0c;不想学Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了&#xff0c;就帮各位搬运一下吧。 二、R代码实现Xgboost分类 &#xff08…

LeetCode题练习与总结:比较版本号--165

一、题目描述 给你两个 版本号字符串 version1 和 version2 &#xff0c;请你比较它们。版本号由被点 . 分开的修订号组成。修订号的值 是它 转换为整数 并忽略前导零。 比较版本号时&#xff0c;请按 从左到右的顺序 依次比较它们的修订号。如果其中一个版本字符串的修订号较…

C++动态内存的管理

今天来分享C动态内存管理相关知识&#xff0c;闲言勿谈&#xff0c;直接上干货。 1. 动态内存的开辟和销毁(new和delete) (1)前置知识&#xff1a;我们知道c语言有malloc和calloc和realloc三个函数可以进行动态的开辟内存&#xff0c;那么它们有什么区别呢&#xff1f;首先是…

MPS 后端

本文来自&#xff1a; https://pytorch.org/docs/stable/notes/mps.html https://pytorch.ac.cn/docs/stable/notes/mps.html MPS 后端 mps 设备支持 在使用 Metal 编程框架的 MacOS 设备上&#xff0c;进行高性能 GPU 训练。 它引入了新的设备&#xff0c;将机器学习计算图和…

【C语言】条件运算符详解 - 《 A ? B : C 》

目录 C语言条件运算符详解1. 条件运算符的语法和使用示例 1&#xff1a;基本用法输出 2. 嵌套条件运算符示例 2&#xff1a;嵌套条件运算符输出 3. 条件运算符与 if-else 语句的比较示例 3&#xff1a;使用 if-else 语句示例 4&#xff1a;使用条件运算符 4. 条件运算符的实际应…

PLC_博图系列☞基本指令”TONR:时间累加器“

PLC_博图系列☞基本指令”TONR&#xff1a;时间累加器“ 文章目录 PLC_博图系列☞基本指令”TONR&#xff1a;时间累加器“背景介绍TONR&#xff1a; 时间累加器说明参数脉冲时序图示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 TONR 背景介绍 这是一篇关于P…

ElasticSearch学习之路

前言 为什么学ElasticSearch&#xff1f; 数据一般有如下三种类型&#xff1a; 结构化数据&#xff0c;如&#xff1a;MySQL的表&#xff0c;一般通过索引提高查询效率非结构化数据&#xff0c;如&#xff1a;图片、音频等不能用表结构表示的数据&#xff0c;一般保存到mong…

Linux C++ 054-设计模式之外观模式

Linux C 054-设计模式之外观模式 本节关键字&#xff1a;Linux、C、设计模式、外观模式 相关库函数&#xff1a; 概念 外观模式&#xff08;Facade&#xff09;&#xff0c;亦称“过程模式”。主张按照描述和判断资料来评价课程&#xff0c;关键的活动是在课程实施的全过程中…

昇思25天学习打卡营第24天|基于MindSpore的Diffusion扩散模型

Diffusion扩散模型 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻译迁移而来&#xff0c;同时参考了由浅入深了解Diffusion Model一文。 关于扩散模型&#xff08;Diffusion Models&#xff09;有很多种理解&#xff0c;本文的介绍是基于denoising di…

基础动态规划题目基础动态规划题目

目录 题目1&#xff1a; P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles 代码示例&#xff1a; 题目2&#xff1a; Common Subsequence 代码示例 题目3 &#xff1a;最长上升子序列 最长不下降子序列 最长上升子序列oj答案 题目1&#xff1a; P1216 [USACO1.5]…