STL-详细介绍list

目录

一、含义介绍

二、遍历(迭代器和范围for)

三、部分接口介绍

1.将两个有序链表归并成一个:merge()

2、去重:unique()

3、将一个链表或链表的结点或链表的迭代器区间插入到另一个链表的某结点之前:splice()(还可以自己转移自己(LRU))

四、模拟实现list


一、含义介绍

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器(时间效率都是O(1)),并且该容器可以前后双向迭代。

2. list的底层是带头双向循环链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。

3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。

4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list 的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这 可能是一个重要的因素)

6、list不支持[ ]的使用,因为空间不连续。

7、头文件:<list>

8、支持头插头删,尾插尾删。

9、大部分接口都和vector一样,可以查看文档

二、遍历(迭代器和范围for)

因为不支持[ ],所以通常使用迭代器和for进行遍历;

int main()
{list<int> lt;//尾插lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);//迭代器遍历list<int>::iterator it = lt.begin();while (it != lt.end()){//修改*it += 10;cout << *it << " ";++it;}cout << endl;//范围forfor (auto e : lt){cout << e << " ";}cout << endl;
}

三、部分接口介绍

1.将两个有序链表归并成一个:merge()

void test2()
{list<int> v1, v2;v1.push_back(1);v1.push_back(2);v1.push_back(3);v2.push_back(4);v2.push_back(5);v2.push_back(6);v1.merge(v2);list<int>::iterator it = v1.begin();while (it != v1.end()){cout << *it << " ";++it;}}

2、去重:unique()

该接口有一个前提,前提就是相同的数要挨在一起,所以通常都是先进行排序在使用此接口

void test3()
{list<int> v1, v2;v1.push_back(1);v1.push_back(2);v1.push_back(2);v1.push_back(3);v1.push_back(3);v1.push_back(3);v1.push_back(4);v1.unique();list<int>::iterator it = v1.begin();while (it != v1.end()){cout << *it << " ";++it;}
}

3、将一个链表或链表的结点或链表的迭代器区间插入到另一个链表的某结点之前:splice()(还可以自己转移自己(LRU))

将自己的2转移到末尾:

void test4()
{list<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);v1.splice(v1.end(), v1, find(v1.begin(), v1.end(), 2));list<int>::iterator it = v1.begin();while (it != v1.end()){cout << *it << " ";++it;}
}

四、模拟实现list

namespace HF
{//结点类template <class T>struct ListNode{ListNode<T>* next;ListNode<T>* prev;T date;ListNode(const T& x = T()):next(nullptr),prev(nullptr),date(x){}};//迭代器(结点的指针)template <class T>struct __list_iterator{typedef ListNode<T> Node;typedef __list_iterator self;Node* _node;__list_iterator(Node* node) :_node(node) {}//重载前置++self& operator++(){_node = _node->next;return *this;}//重载后置++self& operator++(int){self tmp(*this);_node = _node->next;return tmp;}//重载前置--self& operator--(){_node = _node->prev;return *this;}//重载后置--self& operator--(int){self tmp(*this);_node = _node->prev;return tmp;}//重载*T& operator*(){return _node->date;}bool operator!=(const self& s){return _node != s._node;}};//链表类template <class T>class list{typedef ListNode<T> Node;private:Node* _head;public:typedef __list_iterator<T> iterator;list(){empty_init();}//拷贝构造list( list<T>& lt){empty_init();for (const auto& e : lt){push_back(e);}}//初始化void empty_init(){_head = new Node;_head->next = _head;_head->prev = _head;}//析构~list(){clear();delete _head;_head = nullptr;}iterator begin(){return _head->next;}iterator end(){return _head;}//尾插void push_back(const T& x){//没有insert时的写法/*Node* newnode = new Node(x);Node* tail = _head->prev;tail->next = newnode;newnode->prev = tail;newnode->next = _head;_head->prev = newnode;*///复用insertinsert(end(), x);}//头插void push_front(const T& x){insert(begin(), x);}//尾删void pop_back(){erase(--end());}//头删void pop_front(){erase(begin());}//在某个位置插入iterator insert(iterator pos, const T& x){Node* cur = pos._node;Node* prev = cur->prev;Node* newnode = new Node(x);prev->next = newnode;newnode->prev = prev;newnode->next = cur;cur->prev = newnode;//return iterator(newnode);//隐式类型转换return newnode;}//删除指定结点iterator erase(iterator pos){assert(pos != end());Node* cur = pos._node;Node* prev = cur->prev;Node* next = cur->next;prev->next = next;next->prev = prev;delete cur;return next;}//清空void clear(){iterator it = begin();while (it != end()){it = erase(it);}}void swap(list<T>& lt){std::swap(_head,lt._head);}//赋值重载list<T>& opterator = (list<T> lt){if (&lt != this){swap(lt)* this;return *this;}}};

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

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

相关文章

2. 下载rknn-toolkit2项目

官网链接&#xff1a; https://github.com/airockchip/rknn-toolkit2 安装好git&#xff1a;[[1. Git的安装]] 下载项目&#xff1a; git clone https://github.com/airockchip/rknn-toolkit2.git或者直接去github下载压缩文件&#xff0c;解压即可。

ASIO网络调试助手之一:简介

多年前&#xff0c;写过几篇《Boost.Asio C网络编程》的学习文章&#xff0c;一直没机会实践。最近项目中用到了Asio&#xff0c;于是抽空写了个网络调试助手。 开发环境&#xff1a; Win10 Qt5.12.6 Asio(standalone) spdlog 支持协议&#xff1a; UDP TCP Client TCP Ser…

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略&#xff0c;该策略要求请求的域名、协议和端口必须与提供资源的服务相同。…

Linux线程管理进阶:分离,等待、终止与C++11线程接口的封装实践

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f351;线程终止&#x1f34d;线程等待*多线程创建&#xff0c;传自己定义的对象示例代码&#xff1a;* &#x1f34e;线程的分…

STM32(十二):DMA直接存储器存取

DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#xff0c;节省了CPU的资源。&#xff08;运行内存SRAM、程序存储器Flash、寄存器&#xff09; 12个独立可配置的通道&…

[数据集][目标检测]井盖丢失未盖破损检测数据集VOC+YOLO格式2890张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2890 标注数量(xml文件个数)&#xff1a;2890 标注数量(txt文件个数)&#xff1a;2890 标注…

页面要突破手机安全区域来全屏显示(沉浸式模式显示),其他页面不需要,如何设置安全区域文字颜色

#效果图 ##思路遇到的问题 在aboutToAppear中使用window模块的 getLastWindow 和 setWindowLayoutFullScreen两个方法来处理全屏显示 设置沉浸式模式的特点&#xff1a; 在任何一个页面中设置过一次之后&#xff0c;其他页面也会跟着全屏显示 这么处理会出现问题&#xff1a…

在Ubuntu 20.04上安装Nginx的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 Nginx 是世界上最流行的 Web 服务器之一&#xff0c;负责托管互联网上一些最大和流量最高的网站。它是一个轻量级选择&#xff0c…

如何使用Spoon连接data-integration-server并在服务器上执行转换

1.建立连接 2.新建转换或任务 3.右键[子服务器]&#xff0c;新建一个服务器连接(data-integration-server服务器的连接信息) 4.右键[Run configurations],新建一个执行连接,勾选相应的选项即可: 5.选择服务器运行即可! 6.最后&#xff0c;你可以通过服务器端的WEB查看执行日志…

猫眼电影字体破解(图片转码方法)

问题 随便拿一篇电影做样例。我们发现猫眼的页面数据在预览窗口中全是小方框。在当我们拿到源码以后&#xff0c;数据全是加密后的。所以我们需要想办法破解加密&#xff0c;拿到数据。 破解过程 1.源码获取问题与破解 分析 在我们刚刚请求url的时候是可以得到数据的&#xff…

【MySQL】MySQL操作介绍

MySQL操作 认识 MySQL什么是 MySQL关系型数据库的组成结构"客户端-服务器"结构 数据库的基本操作创建数据库查看数据库删除数据库使用数据库 数据类型整型浮点类型字符串类型日期类型总结 表的操作创建表查看表查看表的信息删除表 数据的基础操作插入数据指定列插入全…

部署后端WebSocket服务到AWS云服务器

目录 1.创建AWS账户2.选择EC2实例3.配置EC2实例4.使用VSCode连接到EC2实例5.部署WebSocket服务6.配置域名和SSL&#xff08;可选&#xff09;7.监控和维护 1.创建AWS账户 如果你还没有AWS账户&#xff0c;你需要先在AWS官网注册一个。 2.选择EC2实例 登录到AWS管理控制台。搜…

人工智能领域的微调指的是什么?

目录 微调的原理 微调的过程 微调的优点 微调的应用场景 微调的挑战 总结 在人工智能领域&#xff0c;微调&#xff08;fine-tuning&#xff09;是指在预训练模型的基础上&#xff0c;通过在特定领域或任务上进一步训练模型&#xff0c;从而优化模型性能的过程。微调通常…

Java过滤器和监听器

1. 过滤器 1.1. 过滤器 使用baseServlet的优点&#xff1a;方便进行乱码的统一处理&#xff0c;但是如果不使用servlet&#xff0c;在进行中文乱码处理时就需要在每个servlet中书写&#xff0c;比较麻烦 问题&#xff1a;重复的代码在项目中多次使用书写 解决&#xff1a;过滤…

2024 第七届“巅峰极客”网络安全技能挑战赛初赛 Web方向 题解WirteUp

EncirclingGame 题目描述&#xff1a;A simple game, enjoy it and get the flag when you complete it. 开题&#xff0c;前端小游戏&#xff0c;红点出不去就行 直接玩通关了 看看如何不玩也能拿到flag&#xff0c;flag存储在后端php文件内&#xff0c;前端找不到。 看一下…

【原创】java+springboot+mysql校园二手商品交易网设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

【MySQL】MySQL基础

目录 什么是数据库主流数据库基本使用MySQL的安装连接服务器服务器、数据库、表关系使用案例数据逻辑存储 MySQL的架构SQL分类什么是存储引擎 什么是数据库 mysql它是数据库服务的客户端mysqld它是数据库服务的服务器端mysql本质&#xff1a;基于C&#xff08;mysql&#xff09…

QT 编译报错:C3861: ‘tr‘ identifier not found

问题&#xff1a; QT 编译报错&#xff1a;C3861&#xff1a; ‘tr’ identifier not found 原因 使用tr的地方所在的类没有继承自 QObject 类 或者在不在某一类中&#xff0c; 解决方案 就直接用类名引用 &#xff1a;QObject::tr( )

【舍入,取整,取小数,取余数丨Excel 函数】

数学函数 1、Round函数 Roundup函数 Rounddown函数 取整&#xff1a;(Int /Trunc)其他舍入函数&#xff1a; 2、Mod函数用Mod函数提取小数用Mod函数 分奇偶通过身份证号码判断性别 1、Round函数 Roundup函数 Rounddown函数 Round(数字&#xff0c;保留几位小数)&#xff08;四…

SOEX从去中心化的链上社交关系到创收策略

是时候摆脱传统的在线社区&#xff0c;真正进入 Web3 了&#xff0c;利用区块链的力量&#xff0c;并理解社交互动的意义远不止分享内容或复制交易。代币化将赋能参与提升到一个全新的水平&#xff0c;并带来一系列新的机会。 社交网络可以发挥强大的作用&#xff0c;尤其是从…