C++基础语法:STL之容器(6)--序列容器中的forward_list

前言
     

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

引入


        序列容器的学习.以<C++ Prime Plus> 6th Edition(以下称"本书")内容理解

        本书中容器内容不多只有几页.最好是有数据结构方面的知识积累,如果没有在学的同时补上

        上一篇C++基础语法:链表和数据结构-CSDN博客 中有对单链表做过分析,当时没用类模板,用普通类实现的容器,方法都一样(那边内容还多一点)所以可以结合看.

forward_list(单链表)

         本书就一段话描述单链表.因为内容相对偏少.正如上一篇所说,就算只是链表,也有很多算法可以设计的.而且正因为基础,不要小看了他.

         本书内容解读

        C++11新增了容器类forward_list,它实现了单链表。在这种链表中,每个节点都只链接到下一个节点,而没有链接到前一个节点。因此 forward_list只需要正向迭代器,而不需要双向迭代器。因此,不同于 vector和list,forward_list是不可反转的容器。相比于list,forward_list更 简单、更紧凑,但功能也更少。(本书原话) 

        ----解读:最基本的链表

        注意:以下代码已测试,但不要让插入个数超过允许范围,会产生异常

         定义了构造函数,插入元素,弹出元素,打印链表,反转单链表的算法.        

        Single.h   //容器定义

#include<iostream>
using namespace std;template<class T>
class SingleChain {                         //容器类定义enum { MAX = 20 };class Node {							//结点类public:									//特别注意声明为public,否则作用域无法被访问T t;Node* next;Node(T val) :t(val), next(0) {};Node() { next = 0; };				//默认构造函数};int items;								//当前元素个数int size;								//最大个数Node* head;								//头结点
public:SingleChain(int s = MAX) ;				//默认最大为20void insert(T t);						//插入元素bool pop();								//删除元素void print();							//打印链表void reverse(SingleChain<T>& t);		//反转容器
};template<class T>
SingleChain<T>::SingleChain(int s) {		//构造函数Node* newNode = new Node;				//head是头结点head = newNode;items = 0;size = s;
}template<class T>
void SingleChain<T>::insert(T t) {			//头插法插入元素Node* newNode = new Node(t);newNode->next = head->next;head->next = newNode;items++;
}template<class T>
bool SingleChain<T>::pop() {				//弹出if (items == 0)return false;Node* tmp = head->next;					//标记弹出结点,最后一个插入的结点head->next = head->next->next;			//剥离和链表的关系items--;delete tmp;								//释放结点return true;							//返回
}template<class T>
void SingleChain<T>::print() {				//打印链表值Node* p = head->next;					//头结点不打印while (p) {cout << p->t << endl;p = p->next;}
}template<class T>							//反转单链表
void SingleChain<T>::reverse(SingleChain<T>& t) {Node* p = (t.head)->next;while (p) {this->insert(p->t);p = p->next;}
}

        main.cpp  //测试代码

#include<iostream>	
#include"Single.h"int main(void) {SingleChain<int> a(5);a.insert(1);a.insert(2);a.insert(3);a.insert(4);cout << "添加元素后的链表为:" << endl;a.print();a.pop();cout << "弹出一个元素后的链表为:" << endl;a.print();SingleChain<int> b(5);b.reverse(a);cout << "反转后的链表为:" << endl;b.print();return 0;
}

          运行结果:

添加元素后的链表为:
4
3
2
1
弹出一个元素后的链表为:
3
2
1
反转后的链表为:
1
2
3

反转单链表

        内容介绍中原话"不同于vector和list,forward_list是不可反转的容器",但可以自己实现他.STL是伟大的发明,但他不是万能的.在发明了"迭代器"这一概念,给迭代器分功能后并应用到各种容器上以后,方便使用的同时也有不足的地方.比如这里的不可反转,可由程序员自己实现就是一例证.而且代码也不复杂

template<class T>							//反转单链表
void SingleChain<T>::reverse(SingleChain<T>& t) {Node* p = (t.head)->next;while (p) {this->insert(p->t);p = p->next;}
}

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

以下代码不可用

/*下列代码和下一行作用相同,报异常,原因未明*/
//template<class T>
//T SingleChain<T>::pop() {					//弹出
//	Node* tmp = head->next;					//标记弹出结点,最后一个插入的结点
//	head->next = head->next->next;			//剥离和链表的关系
//	T t = tmp->t;							//取出结点值
//	items--;
//	delete tmp;								//释放结点
//	return t;								//返回
//}

        在设计弹出的时候,开始想把弹出结点值返回,结果出了异常,也找不到原因,有知道的朋友请帮忙,谢谢

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

 小结

        单链表相对来说没那么复杂,以至于本书都没有相关内容可参考,一般来说他是作为其他数据结构的基础而存在. 

        在学STL的同时,更重要的是自己理解数据结构,并根据需求设计算法

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

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

相关文章

Linux系统命令:监控 CPU 性能的工具mpstat详解

目录 一、概述 二、语法和使用 1、基本语法 2、常用选项 三、安装 mpstat 1、Debian&#xff08;如 Ubuntu&#xff09;的系统安装 2、CentOS 或 Fedora系统的安装 &#xff08;1&#xff09;安装指令 &#xff08;2&#xff09;安装操作 3、使用 四、示例 1. 查看…

【人工智能】Python实现文本转换为语音:使用gTTS库实现

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、准备工作三、使用gTTS实现文本转换为语音详细步骤 四、人工智能与TTS技术五、总结 一、引言 文本转换为语音&#xff08;Text-to-Speech&#xff0c;简称TTS&#xff09;技术是人工智能的重要组成部分&#xf…

Unity UGUI 之 Canvas画布

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 1.UGUI是什么 首先官方手册导向了这两个连接&#xff0c;里面是ugui的基本教程 帆布 |U…

【C语言】 链表实现学生管理系统(堆区开辟空间)

总体思路都能写出来&#xff0c;问题是感觉稍微比之前的麻烦一些&#xff0c;在刚开始创建结构体的时候&#xff0c;并没有去按照链表的思路去写&#xff0c;导致写成了顺序表&#xff0c;后面就一直纠结空间怎么开辟。 链表是由一个头节点和其它申请出来的小节点连起来的&…

统计一个页面用到的html,css,js

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>统计html</title><style>* {margin: …

Web前端知识视频教程分享(四) jQuery

资料下载地址: https://545c.com/f/45573183-1334618723-883dfe?p7526 (访问密码: 7526)

【有效验证】解决SQLyog连接MYSQL的错误 1251 - Client does not support

目录 一、原因分析&#xff1a; 二、进入到mysql 三、查看当前加密方式 四、更改加密方式 五、查看是否成功 前言&#xff1a;使用一个开源软件使用sqlyog、navcat都报1251错误&#xff0c;网上都是提示升级客户端&#xff0c;还有一种就是修改mysql配置。本文就是修改配置…

虚拟机OP的LAN网口设置

问题&#xff1a;unraid通过虚拟机安装OP&#xff0c;然而一个网口连接路由器&#xff0c;总是无法为其他设备提供DHCP&#xff0c;导致无法使用。 一、虚拟机OP配置 二、OP内部配置 对于Lan网口&#xff0c;启用强制&#xff0c;这样可以防止OP被网口接的路由器产生冲突 三、…

认识接口测试

接口测试为什么重要&#xff1f; 我相信你一定听说过这样一句话&#xff1a;“测试要尽早介入&#xff0c;测试进行得越早&#xff0c;软件开发的成本就越低&#xff0c;就越能更好地保证软件质量。” 但是如何尽早地进入测试&#xff0c;作为软件测试的你&#xff0c;是不是…

web自动化测试

自动化测试理论 UI&#xff1a;User Interface&#xff08;用户接口-用户界面&#xff09;&#xff0c;主要包括&#xff1a;app、web ui自动化测试&#xff1a;使用工具或代码执行用例的过程 什么样的项目适合做自动化 1、需要回归测试项目&#xff08;甲方自营项目、金融、…

IPS(入侵防御)和AS(反病毒)的总结

目录 IAE引擎 深度行为检测技术 深度包检测 DPI 深度包检测的分类 1&#xff0c;基于特征字的检测技术 2&#xff0c;基于应用网关的检测技术 3&#xff0c;基于行为模式的检测技术 深度流检测 DFI DPI和DFI的对比 IPS&#xff08;入侵防御&#xff09; 入侵检测 IDS 入侵防御…

分布式锁的使用场景是什么?有哪些实现方法?

在单体架构中&#xff0c;多个线程都是属于同一个进程的&#xff0c;所以在线程并发执行遇到资源竞争时&#xff0c;可以利用ReentrantLock、synchronized等技术来作为锁&#xff0c;来控制共享资源的使用。 而在分布式架构中&#xff0c;多个线程是可能处于不同进程中的&…

5.串口通信

串口的介绍 UART&#xff08;通用异步收发器&#xff09;是一种双向、串行、异步的通信总线&#xff0c;仅用一根数据接收线&#xff08;RX&#xff09;和一根数据发送线&#xff08;TX&#xff09;就能实现全双工通信 R&#xff1a;Receiver(接收)&#xff0c;T&#xff1a;T…

mac os 去除压缩包下的__MACOSX

mac os 去除压缩包下的__MACOSX 步骤 步骤 在mac上压缩文件后执行 zip -d xxx.zip "__MACOSX*"

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 中文分词模拟器(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

Vue的动态和异步组件:提升应用性能的利器

引言 在现代前端应用开发中,组件化是构建用户界面的主流方式。Vue.js 作为一个流行的前端框架,提供了强大的组件系统。Vue 不仅支持静态组件的使用,还支持动态组件和异步组件。动态组件允许我们在运行时动态地切换不同的组件,而异步组件则允许我们在需要时才加载组件。这两…

浅谈Canal原理

canal [kə’nl]&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据 订阅 和 消费。应该是阿里云DTS&#xff08;Data Transfer Service&#xff09;的开源版本。 Canal与DTS提供的功能基本相似&#xff1a; 基于…

vue2学习笔记9 - 通过观察vue实例中的data,理解Vue中的数据代理

接着上一节&#xff0c;学一学vue中的数据代理。学vue这几天&#xff0c;最大的感受就是&#xff0c;名词众多&#xff0c;听得发懵。。不过&#xff0c;深入理解之后&#xff0c;其实说得都是一回事。 在Vue中&#xff0c;数据代理是指在实例化Vue对象时&#xff0c;将data对…

神经网络模型实现(训练、测试)

目录 一、神经网络骨架&#xff1a;二、卷积操作&#xff1a;三、卷积层&#xff1a;四、池化层&#xff1a;五、激活函数&#xff08;以ReLU为例&#xff09;&#xff1a;六、模型搭建&#xff1a;七、损失函数、梯度下降&#xff1a;八、模型保存与加载&#xff1a;九、模型训…

Oracle select for update 用法

SELECT FOR UPDATE 用法 1、SELECT…FOR UPDATE 语法 SELECT … FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED]; 其中&#xff1a;   OF 子句用于指定即将更新的列&#xff0c;即锁定行上的特定列。   WAIT 子句指定等待其他用户释放锁的秒数&#xff0c;防止…