C++:list篇

前言:

        观看C++的list前需要对链表有一些了解,如C语言的链表结构。本片仅介绍list容器中常用的接口函数概念以及使用。

list的概念:        

          简而言之,C++的list是一个双向带哨兵位的链表容器模板 

      

list的构造:

        1.list():默认构造

        2.list (const list& x) :拷贝构造函数

        3.list (InputIterator first, InputIterator last) 用[first, last)左闭右开的区间中的元素构造list.

        上图的输出打印是使用范围for进行打印,而范围for底层为list的迭代器。list的迭代器与vector、string的迭代器都不相同,这点小编会再下面进行大概讲解。

list迭代器(iterator)的使用:

        1.iterator begin();

        list的begin返回的是第一个有效节点的地址。

        2.iterator end();

                list的end返回的是哨兵为节点的地址。

     

        那么从上面的begin与end可以看出,使用迭代器遍历list,仅仅只需要解引用迭代器以及++迭代器就能取得我们想要的值与让迭代器走向下一个节点,那么有没有想过一个问题,list的迭代器与vector这种类似数组的迭代器底层是否是一样的呢?

        vector是一个天然的数组,而数组是一段连续的地址空间,vector的迭代器可以直接进行++就可以找到下一个数据的地址,解引用也可以直接访问数据

        而从上图的list是一个不连续的空间,单直接进行++的话会访问到当前节点+1的地址空间,那么此时就变成了野指针。并且对list迭代器进行*(解引用)操作如果单纯的来看,对it解引用会是一个节点,而并非节点内的数据。但根据输出可以看到list的迭代器与vector的迭代器使用起来并无差别

        但其实这是对list迭代器进行了封装操作,使得上层的使用看起来是一样的,但其实底层已经完全不一样了但为了方便理解list可暂时将迭代器理解成一个指针。

list capacity(容量)接口

        

        1.list.empty():判断当前链表是否为空

        

        empty函数是判断除哨兵位节点外是否还有其他节点,如果有则不为空,如果没有则为空.

        2.list.size():返回当前链表的节点个数

list的modifiers(修饰符)接口函数

        1.list.push_back

        2.list.insert:

    

        从上图可以看到,如果直接还是和之前vector一样向在第二个位置插入一个值,那么首先要让迭代器走到第二个位置,那么在list中是不能直接进行+2的操作,必须通过循环迭代到第二个位置。

        

       

        那么在insert里存不存在迭代器失效问题呢?

                答案是显而易见的,迭代器肯定是不会失效的,因为list不会涉及到扩容问题,同时此时pos也没有改变指向的位置,所以迭代器不会有失效的问题

        3.list.erase

                

        那么list的erase是否会有迭代器失效的问题?

        

        我们可以看到,当erase后如果在对it迭代器进行操作,vs则会进行强制检查(根据编译环境不同,处理环境也不相同),则不允许再继续使用,如果想继续使用的话,C++同样也给出了方案,可以看到erase会返回一个迭代器,而返回的迭代器就是下一个链表的位置。所以需要 it迭代器重新赋值就可以继续使用。

        4.list.swap

        

                5.list.clear

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

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

相关文章

spring之异常和测试相关注解

原文地址 ControllerAdvice和ExceptionHandler 通常组合使用,用于处理全局异常,示例代码如下: ControllerAdvice Configuration Slf4j public class GlobalExceptionConfig {private static final Integer GLOBAL_ERROR_CODE 500;Excepti…

认识git和git的基本使用,本地仓库,远程仓库和克隆远程仓库

本地仓库 #安装git https://git-scm.com/download/win #git是什么?有什么用? git相当于一个版本控制系统,版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 作用: 记录(项目&#…

[Qt5] 使用QtConcurrent::run在异步线程中执行耗时函数

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…

Java-树形图工具类TreeUtil

TreeUtil 工具类,包括列表转树形结构、遍历、查找和删除节点等功能。 import java.util.*;public class TreeUtil {/*** 将列表转换为树形结构。** @param target 扁平化的节点列表* @param getId 获取节点ID的函数* @param getParentId 获取节点父ID的函数* @…

物联网(IoT)支持的小型水处理厂实时硬件在环(HIL)仿真

这篇论文的标题是《Real-Time Hardware-In-The-Loop Simulation of IoT-Enabled Mini Water Treatment Plant》,作者是 Mohamad Taib Miskon 等人,发表在 2024 年 IEEE 自动控制与智能系统国际会议(I2CACIS)上。以下是该论文的主要…

【Agent】Agent Q: Advanced Reasoning and Learning for Autonomous AI Agents

1、问题背景 传统的训练Agent方法是在静态数据集上进行监督预训练,这种方式对于要求Agent能够自主的在动态环境中可进行复杂决策的能力存在不足。例如,要求Agent在web导航等动态设置中执行复杂决策。 现有的方式是用高质量数据进行微调来增强Agent在动…

学习日志29

论文阅读:IBM Q Experience as a versatile experimental testbed for simulating open quantum systems 引言部分: 引言部分首先介绍了开放量子系统的理论研究的重要性,这些理论描述了量子系统与其环境相互作用的动力学。这种理论对于理解量…

C++复习day01

这篇博客主要复习C语言的数组和指针 1.指针数组和数组指针 问:指针数组和数组指针,哪一个是指针,哪一个是数组? 我们来类比一下,整型数组是存放整型的数组,那么指针数组就是一个存放指针的数组&#xff0…

经验笔记:进程、线程与协程的理解与应用

经验笔记:进程、线程与协程的理解与应用 1. 引言 在软件开发中,特别是在涉及并发编程的场景下,进程、线程和协程是非常重要的概念。理解它们各自的定义、特点以及彼此之间的联系对于有效地设计和实现高效的应用程序至关重要。 2. 定义与特…

vector 常见函数

目录 一.vector 构造函数 二 . Iterators 迭代器(random access iterator) 三.Capacity: 空间 3.1 resize 3.2 reserve 四.Element access: 元素访问 方式 4.1 operator[] 类似于数组的 [] 4.2 front 和back 五.Modifiers: 六.vector 的 二…

【工业AI】寻优算法的思考

遗传算法GA 本质上来讲,就是找随机点x,通过公式或者回归模型构成的映射函数获得y。 区别于其他搜索寻优算法之处在于:遗传算法的一轮一轮迭代中,新的随机点x的生成,是靠交叉变异01而来的。 初始的DNA_size不管设置为多…

vue3+ts文件流导出xlsx表格需要token

封装方法post请求 import { ElLoading } from element-plus; import axios from axios; export const exportFilePost (params: any) > {const loadingInstance ElLoading.service({background: rgba(255, 255, 255, 0),});axios.post(params.url, params.data, {headers…

redis内存数据库的专业术语雪崩、击穿、穿透的名词解释

redis作为一个内存数据库,其作用主要体现在可以提供高速的访问处理。 redis在内存层面工作,一个字,快。 这也是redis区别于其他类型数据库的一个主要特点。 与之配合使用的是后端持久化存储数据库,比如结构化的数据库mysql mysql的…

18、Gemini-Pentest-v2

难度 中 目标 root权限 一个flag 靶机启动环境为VMware kali 192.168.152.56 靶机 192.168.152.63 信息收集 web测试 访问80端口 上面介绍了一下这个系统是一个内部系统,让员工查看他们的个人资料还可以导出为PDF 页面还有一个链接是UserList可以访问但是页面什…

ES数据写入过程

1. 写入请求 当一个写入请求(如 Index、Update 或 Delete 请求)通过REST API发送到Elasticsearch时,通常包含一个文档的内容,以及该文档的索引和ID。 2. 请求路由 协调节点:首先,请求会到达一个协调节点…

微服务日常总结

1.当我们在开发中,需要连接多个库时,可以在yml中进行配置。 当在查询的时候,跨库时,需要通过DS 注解来指定,需要yml配置需要保持一致。 2. 当我们想把数据存入到clob类型中,需要再字段 的占位符后面加上j…

Python 用pandas连接Postgresql库

pandas确实蛮强的,记录使用的代码 from sqlalchemy import create_engine import pandas as pd import os# 从环境变量中读取数据库连接信息 user os.getenv(DB_USER, xxx) # 数据库用户名 password os.getenv(DB_PASSWORD, xxx) # 数据库密码…

HarmonyOS(53) 获取设备标志符UUID和ODID

UUID和ODID UUID和ODID简介UUID生成规则ODID生成规则相关代码参考资料 UUID和ODID简介 在APP开发过程中,经常需要一些唯一标识符作为留痕使用,HaymonyOS也提供了UUID和ODID来满足类似的工作。 UUID:应用卸载重新安装时会重新生成UUIDODID:手…

Zookeeper 官方示例2-SyncPrimitive 代码解读(二)

测试命令 java jar .\ZookeeperDemo-0.0.1-SNAPSHOT.jar bTest 192.168.206.100:2181 2 1. Barrier(阻塞原语) 1.1 概念 [!quote] A barrier is a primitive that enables a group of processes to synchronize the beginning and the end of a comput…

Nginx负载均衡静态资源缓存配置指南

引言 Nginx 是一款高性能的 HTTP 服务器和反向代理,广泛用于提供负载均衡服务。在处理静态资源时,合理配置 Nginx 的缓存机制可以显著提高应用性能和响应速度。本文将详细介绍如何在 Nginx 负载均衡中配置静态资源的缓存。 静态资源缓存的重要性 静态…