C++——list
目录
list介绍
list的函数接口
构造函数
push_front和pop_front
push_back和pop_back
insert
erase
迭代器
front和back
size
resize
empty
clear
list::sort
unique
reverse
迭代器的实现
list介绍
- list是一种可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
- list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结点中通过指针指向其前一个元素和后一个元素。
- list与forward_list非常相似,最主要的不同在于forward_list是单链表,只能进行单方向迭代。
- 与其他容器相比,list通常在任意位置进行插入、删除元素的执行效率更高。
- list和forward_list最大的缺陷是不支持在任意位置的随机访问,其次,list还需要一些额外的空间,以保存每个结点之间的关联信息(对于存储的类型较小元素来说这可能是一个重要的因素)。
总的来说,list就是一个带头双向循环链表。
list的函数接口
构造函数
list<int> l1; //构造int类型的空容器 list<int> l2(10, 2); //构造含有10个2的int类型容器 list<int> l3(l2); //拷贝构造int类型的l2容器的复制品push_front和pop_front
// push_front函数用于头插,pop_front函数用于头删 list<int> l; l.push_front(1); l.push_front(0);l.pop_front()push_back和pop_back
// push_back函数用于尾插,pop_back函数用于尾删 list<int> l; l.push_back(0); l.push_back(1);l.pop_back();insert
list<int> l; l.push_back(0); l.push_back(1); l.push_back(2);list<int>::iterator pos = find(l.begin(), l.end(), 2); // 要包含algorithm库l.insert(pos, 10); // 在pos=2位置之前插入10l.insert(pos, 2, 9); // 在pos=2位置之前插入2个9erase
list<int> l; l.push_back(0); l.push_back(1);list<int>::iterator pos = find(l.begin(), l.end(), 1); if (pos != l.end()) // 一定要找到了再删除 {l.erase(pos); // 删除指定迭代器位置的元素// pos = l.erase(pos) // 也可以接受返回值,返回的是删除位置的下一个节点 }要注意的是list也有迭代器失效的问题,既然放到erase这里才讲,那就是erase的时候会导致迭代器失效。
迭代器
list<int> l(5, 2); // 正向迭代器遍历容器 list<int>::iterator it = lt.begin(); while (it != lt.end()) {cout << *it << " ";it++; }// 反向迭代器遍历容器 list<int>::reverse_iterator rit = lt.rbegin(); while (rit != lt.rend()) {cout << *rit << " ";rit++; }front和back
// size函数用于获取当前容器当中的元素个数 list<int> l; l.push_back(0); l.push_back(1); l.push_back(2); cout << l.size() << endl;size
// front函数用于获取list容器当中的第一个元素,back函数用于获取list容器当中的最后一个元素 list<int> l; l.push_back(0); l.push_back(1); l.push_back(2);cout << l.front() << endl; cout << l.back() << endl;resize
// 当所给值大于当前的size时,将size扩大到该值,扩大的数据为第二个所给值,若未给出,则默认为容器所存储类型的默认构造函数所构造出来的值。 // 当所给值小于当前的size时,将size缩小到该值。 list<int> l(5, 1); l.resize(10, 2);l.resize(2);empty
list<int> l; cout << l.empty() << endl; // 判断容器是否为空,返回的是bool类型,就是0或1clear
// clear函数用于清空容器,清空后容器的size为0。 list<int> l(5, 1); l.clear();list::sort
list<int> l; l.push_back(4); l.push_back(7); l.push_back(5); l.push_back(9);l.sort(); // 默认将容器内数据排为升序// 既然algorithm中已经有了一个sort函数,那为什么还有在list中加入这个函数呢 // 那是因为,算法库中的sort让list使用是会报错的 // 算法库中的sort要求物理空间必须是连续的// 注意:一般也不会使用list中的sort函数 // 在数据量大的时候,效率较低,不如直接把数据插入到vector中使用algorithm中的sort函数unique
// unique函数用于删除容器当中连续的重复元素,使用这个函数必须要先排序 list<int> l; l.push_back(0); l.push_back(0); l.push_back(1); l.push_back(1); l.push_back(2); l.push_back(3); l.unique();reverse
// reverse函数用于将容器当中元素的位置进行逆置 list<int> l(); l.push_back(0); l.push_back(1); l.push_back(2); l.push_back(3); l.reverse();
迭代器的实现
// 简单定义一下list的结构 template<class T> class list_node // 结点 {T _data;list_node<T>* _next;list_node<T>* _prev;list_node(const T& x = T()):_data(x),_next(nullptr),_prev(nullptr){} };template<class T> struct __list_iterator // 这里使用struct不用考虑class的权限 {typedef list_node<T> Node;typedef __list_iterator<T> iterator;Node* _node; // 迭代器还是结点的指针__list_iterator(Node* node) // 用指针初始化迭代器:_node(node){}bool operator!=(const iterator& it) const{return _node != it._node; // 判断两个迭代器指针不等就可以了}T& operator*(){return _node->_data; // 解引用就是拿到结点指向的值}T* operator->() // ->运算符是使用指针来访问成员{return &(operator*()); // 拿到指针指向的数据再取地址返回这个指针类型}iterator& operator++() // ++就把下一个结点的指针赋值给_node,注意这是前置++{_node = _node->_next;return *this;} };template<class T> class list {typedef list_node<T> Node; public:typedef __list_iterator<T> iterator;void push_back(const T& x){Node* tail = _head->_prev;Node* newnode = new Node(x);tail->_next = newnode;newnode->_prev = tail;newnode->_next = _head;_head->_prev = newnode;}iterator begin() // begin就是头结点的下一个{return iterator(_head->_next); // 使用头结点的下一个的指针构造迭代器}iterator end() // end就是头结点{return iterator(_head->_prev);}list() // 构造函数{_head = new Node;_head->_next = _head;_head->_prev = _head;} public:Node* _head; };void test01() {list<int> l;l.push_back(1);l.push_back(2);list<int>::iterator it = l.begin();while (it != l.end()){cout << it->_data << endl; // 使用->运算符重载,有的时候,list中存放的不是int类型的数据,只使用一次it->是不够的// 比如一个坐标类型,有两个成员变量,it->只能拿到这个坐标类型的指针// 但是还不能访问到这个类型的成员,所以需要使用it->->// 但这样又会显得很奇怪,所以编译器为了增加可读性进行了特殊处理,所以用一个->就可以了++it;} }// 既然有了正常的迭代器,那如果是const对象呢 // const对象使用正常迭代器时会出现权限的放大,不可以被修改 // 那有一个返回const类型的函数就可以了,例如下面这个函数T& opeartor*() {} // 这里可以添加一个返回const类型的函数 // 但是只有返回类型不一样不能构成重载 // 所以笨方法就是再写一个const迭代器类,这个类除了返回值不一样,其他的基本都一样 // 但是很忌讳这样写// 可以这样该一下模板参数 template<class T, class Ref, class Ptr> // Ref就是引用,Ptr就是指针 struct __list_iterator {typedef __list_iterator<T, Ref, Ptr> iterator;// ... }// operator*()就可以修改为 Ref opeartor*() {}// operator->()可以修改为 Ptr operator->() {}template<class T> class list {typedef list_node<T> Node; public:typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;const_iterator cbegin() const{return cosnt_iterator(_head->_next);}const_iterator cend() const{return cosnt_iterator(_head);}// ... }
相关文章:
C++——list
目录 list介绍 list的函数接口 构造函数 push_front和pop_front push_back和pop_back insert erase 迭代器 front和back size resize empty clear list::sort unique reverse 迭代器的实现 list介绍 list是一种可以在常数范围内在任意位置进行插入和删除的序列…...
【Linux】第九站:make和makefile
文章目录 一、 Linux项目自动化构建工具make/Makefile1.make/makefile工作现象2.依赖关系与依赖方法3.如何清理4.为什么这里我们需要带上clean5.连续的make6.特殊符号 二、Linux下实现一个简单的进度条1.回车换行2.缓冲区3.倒计时的实现 一、 Linux项目自动化构建工具make/Make…...
一文了解什么是WebSocket
WebSocket 允许我们创建“实时”应用程序,与传统 API 协议相比,该应用程序速度更快且开销更少。 一、WebSocket 是如何工作的 按照传统的定义,WebSocket是一种双工协议,主要用于客户端-服务器通信通道。它本质上是双向的&…...
redis是什么
redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。和Memcached类似。redis支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。 一、 基本…...
基于深度学习的人脸专注度检测计算系统 - opencv python cnn 计算机竞赛
文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的人脸专注度…...
跨境电商的新引擎:崛起的网红经济
随着全球数字化时代的崛起,跨境电商成为了国际贸易的新引擎,而在这个巨大的变革浪潮中,网红经济正在崭露头角,成为这一引擎的有力推动者。在这篇文章中,我们将深入探讨网红经济如何催生跨境电商的新动力,以…...
P2006 赵神牛的游戏 python解法
赵神牛的游戏 题目描述 在 DNF 中,赵神牛有一个缔造者,他一共有 k k k 点法力值,一共有 m m m 个技能,每个技能耗费的法力值为 a i a_i ai,可以造成的伤害为 b i b_i bi,而 boss 的体力值为 n n…...
Unity的碰撞检测(六)
温馨提示:本文基于前一篇“Unity的碰撞检测(五)”继续探讨两个游戏对象具备刚体的BodyType均为Dynamic,但是Collision Detection属性不同的碰撞检测,阅读本文则默认已阅读前文。 (一)测试说明 在基于两个游戏对象都具…...
从前序与中序遍历序列构造二叉树
代码如下,开袋即食 class Solution {private Map<Integer,Integer> map;public TreeNode buildTree(int[] preorder, int[] inorder) {map new HashMap<>();for(int i 0;i<preorder.length;i){map.put(inorder[i],i);}return build(preorder,inord…...
antd5上传图片显示405解决
antd5上传图片,默认使用上传方式会调用本地的接口。 405 Method Not Allowed 状态码 405 Method Not Allowed 表明服务器禁止了使用当前 HTTP 方法的请求。 Upload {...props}beforeUpload{(file) > {//自定义上传图片的逻辑//最后返回falsereturn false }} &…...
生成瑞利信道(Python and Matlab)
channel h k h_k hk is modeled as independent Rayleigh fading with average power loss set as 10^−3 Python import numpy as np# Set the parameters average_power_loss 1e-3 # Average power loss (10^(-3)) num_samples 1000 # Number of fading samples to …...
数据结构Demo——简单计算器
简单计算器 一、项目介绍二、技术使用三、具体代码实现1.前端部分2.后端部分 一、项目介绍 本项目实现了一个通过网页访问的简单计算器,它可以对带括号的加减乘除表达式进行计算并将计算结果返回给用户,并且可以对用户输入的表达式进行合法性判断&#…...
java实现多文件打包压缩,导出zip文件
一.实现多文件打包压缩 Testpublic void testZipFile() throws IOException {String filePath "D:\\导出压缩文件.zip";OutputStream outputStream new FileOutputStream(filePath);try (ZipOutputStream zipOutputStream new ZipOutputStream(outputStream)) {//…...
java-枚举类的使用
public enum MyEnum {ONE("一"),TWO("二"),THREE("三");private final String myNum;MyEnum(String myNum) {this.myNum myNum;}public String getMyEnum() {return myNum;} }调用 MyEnum num MyEnum.ONE; System.err.println(num.getMyEnum…...
Vue插槽
插槽的作用就是在组件中的指定位置传入指定的内容 比如我们有两个相同样式的分类栏,但是里面的内容不同,一个是展示图片,一个是展示ul列表: 这样的情况我们就可以使用插槽来实现。 一、默认插槽 (一)指定…...
学习c++的第二天
目录 数据类型 基本数据类型 typedef 声明 枚举类型 类型转换 变量类型 变量定义 变量声明 左值(Lvalues)和右值(Rvalues) 变量作用域 数据类型 基本数据类型 C 为程序员提供了种类丰富的内置数据类型和用户自定义的数…...
Android NDK开发详解之调试和性能分析的系统跟踪概览
Android NDK开发详解之调试和性能分析的系统跟踪概览 系统跟踪指南 “系统跟踪”就是记录短时间内的设备活动。系统跟踪会生成跟踪文件,该文件可用于生成系统报告。此报告有助于您了解如何最有效地提升应用或游戏的性能。 有关进行跟踪和性能分析的全面介绍&#x…...
AD9371 官方例程HDL JESD204B相关IP端口信号
AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 : AD9371 官方…...
蓝牙服务:优化体验,提高连接效率
文章目录 1. 对蓝牙连接进行优化2. 设备配对的缓存机制3. 优化蓝牙连接的稳定性 蓝牙技术已经成为我们生活中不可或缺的一部分,我们使用它进行音频传输、数据传输、设备连接等等。然而,有时蓝牙连接会让用户感到非常困扰,比如连接速度缓慢、连…...
SSM校园设备管信息管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目
选题理由 随着计算机网络及多媒体技术的广泛应用,互联网已成为高校办学的基础设施和必备条件,基于互联网的高校信息管理越来越综合化,越来越多的教学管理、行政管理工作将架构在互联网上,互联网正在变为学校实施教学、科研和管理…...
开源工具Legacy iOS Kit:旧设备维护全攻略
开源工具Legacy iOS Kit:旧设备维护全攻略 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 随着科技发展…...
通过AIBIYE的智能优化功能,应用五大技巧,有效减少论文重复内容,确保符合要求。
嘿,大家好!我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题:论文重复率飙到30%以上怎么办?别慌,我这就分享5个实用降重技巧,帮你一次搞定,轻松压到合格线以下。这些方法都是我亲身试验过的&a…...
如何实现微信聊天记录的永久保存与智能分析
如何实现微信聊天记录的永久保存与智能分析 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg 在数字时代&…...
慕尼黑工业大学突破:让AI医生像真正的放射科医生一样诊断病情
在传统的医学诊断中,放射科医生需要像侦探一样工作——他们不是简单地看一张X光片或CT图像就下结论,而是要仔细翻阅整套医学影像资料,在不同的切片之间寻找线索,调整显示设置来看得更清楚,有时还需要使用专业工具进行测…...
如何快速实现PyTorch语义分割:编码器-解码器架构完整指南
如何快速实现PyTorch语义分割:编码器-解码器架构完整指南 【免费下载链接】semantic-segmentation-pytorch Pytorch implementation for Semantic Segmentation/Scene Parsing on MIT ADE20K dataset 项目地址: https://gitcode.com/gh_mirrors/se/semantic-segme…...
5步焕新Win11桌面:MicaForEveryone打造个性化窗口美学指南
5步焕新Win11桌面:MicaForEveryone打造个性化窗口美学指南 【免费下载链接】MicaForEveryone Mica For Everyone is a tool to enable backdrop effects on the title bars of Win32 apps on Windows 11. 项目地址: https://gitcode.com/gh_mirrors/mi/MicaForEve…...
Goby 漏洞预警|山石网科 WAF /captcha 命令执行漏洞深度分析与防护策略【附复现步骤】
1. 山石网科WAF命令执行漏洞深度解析 最近安全圈曝出一个高危漏洞——山石网科WAF的/captcha接口存在命令执行漏洞。作为一款企业级Web应用防火墙,这个漏洞意味着攻击者可能直接绕过防护,在服务器上执行任意命令。我第一时间用Goby进行了复现测试&#x…...
TensorFlow 2.x数据管道优化:TF Data模块的5个高效技巧
TensorFlow 2.x数据管道优化:TF Data模块的5个高效技巧 【免费下载链接】TensorFlow Project containig related material for my TensorFlow articles 项目地址: https://gitcode.com/gh_mirrors/ten/TensorFlow TensorFlow 2.x数据管道优化是提升模型训练效…...
WaveTools鸣潮工具箱:游戏辅助工具性能增强与数据分析全攻略
WaveTools鸣潮工具箱:游戏辅助工具性能增强与数据分析全攻略 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools鸣潮工具箱是一款专为《鸣潮》玩家打造的游戏辅助工具,集成性…...
如何为Jellyfin添加豆瓣插件:一键获取中文元数据和评分的完整指南
如何为Jellyfin添加豆瓣插件:一键获取中文元数据和评分的完整指南 【免费下载链接】jellyfin-plugin-douban Douban metadata provider for Jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-douban 还在为Jellyfin媒体库缺少中文信息…...
