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项目
选题理由 随着计算机网络及多媒体技术的广泛应用,互联网已成为高校办学的基础设施和必备条件,基于互联网的高校信息管理越来越综合化,越来越多的教学管理、行政管理工作将架构在互联网上,互联网正在变为学校实施教学、科研和管理…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...
