STL list基本用法

目录

  • list的使用
    • 构造函数和赋值重载
    • 迭代器(最重要)
    • 容量相关
    • 插入删除
    • 元素操作
      • reverse
      • sort
      • unique
      • remove
      • splice

list的底层实际是双向链表结构

list的使用

构造函数和赋值重载

构造函数说明
list()无参构造
list (size_type n, const value_type& val = value_type())构造的list中包含n个值为val的元素
list (const list& x)拷贝构造函数
list (InputIterator first, InputIterator last)用[first, last)区间中的元素构造list

构造函数和前面的容器用法相同

void test1()
{list<int> lt1;//无参构造list<int> lt2(10, 1);//1,1,1,1,1,1,1,1,1,1list<int> lt3(lt2);//拷贝构造list<int> lt4(lt2.begin(), lt2.end());
}

赋值重载

list& operator= (const list& x);
void test1()
{list<int> lt1;//无参构造list<int> lt2(10, 1);//1,1,1,1,1,1,1,1,1,1list<int> lt3(lt2);//拷贝构造list<int> lt4(lt2.begin(), lt2.end());list<int> lt5;lt5 = lt4;//赋值重载
}

迭代器(最重要)

迭代器类型分为三种:单向迭代器、双向迭代器、随机迭代器

单向迭代器:支持++          例如forward_list、哈希的迭代器类型是单向迭代器
双向迭代器:支持++,- -      例如list、map、set的迭代器类型是双向迭代器
随机迭代器:支持++,- -,+,-   例如vector、string、deque的迭代器类型是随机迭代器

随机迭代器可以认为是特殊的双向迭代器,双向迭代器可以认为是特殊的单向迭代器

在这里插入图片描述


list的迭代器与vectorstring不同
迭代器的类型是与容器底层结构决定的

vectorstring的底层是连续的,所以它们的迭代器实际上就是指针,所以它们支持++,–,+,- ,类型是随机迭代器

list的底层是不连续的,前后是通过指针连接在一起的,所以它的迭代器不是指针(实际上是指针经过封装),经过封装后,迭代器会支持++、- -,类型是单向迭代器

对于不支持+,-,这样封装是因为:像it.begin()+5这样的效率太低,C++不支持

list的迭代器不支持像vector中的it.begin()+5,如果这样写会报错

在这里插入图片描述
只支持++,--

void test2()
{list<int> lt{ 1,2,3,4,5,6 };lt.begin()--;lt.begin()++;
}

如果想将list的迭代器像vectorit.begin()+5一样移动多个位置,只能这样:

void test2()
{list<int> lt{ 1,2,3,4,5,6 };list<int>::iterator it = lt.begin();for (size_t i = 0; i < 5; i++){++it;}
}

剩下的,list迭代器也支持之前的函数,用法也相同
在这里插入图片描述


容量相关

empty

bool empty() const;

判断容器是否为空


size

size_type size() const;

返回容器中元素的个数


插入删除

list作为双向循环链表,头插,头删,尾插,尾删的效率都很高,所以list中都支持这些操作

函数说明
void push_front (const value_type& val);在list首元素前插入值为val的元素
void pop_front();删除list中第一个元素
void push_back (const value_type& val);在list尾部插入值为val的元素
void pop_back();删除list中最后一个元素
void test3()
{list<int> lt{ 1,2,3,4,5,6 };lt.push_back(10);lt.push_front(0);lt.pop_back();lt.pop_front();
}

insert

iterator insert (iterator position, const value_type& val);void insert (iterator position, size_type n, const value_type& val);template <class InputIterator>void insert (iterator position, InputIterator first, InputIterator last);

insert的操作和vector中的用相同,但是这个insert不会导致迭代器失效
因为链表的插入必须要扩容,迭代器是指向某一个节点,插入后迭代器还是指向原先的节点,不会导致失效

erase

iterator erase (iterator position);
iterator erase (iterator first, iterator last);

erase 的操作和vector中的用相同,这个erase 会导致迭代器失效
迭代器是指向某一个节点,删除这个节点后,迭代器失效


元素操作


reverse

void reverse();

这个reverselist类中自带的一个函数,作用是逆置链表

<algorithm>中也有一个reverse函数
reverse函数中迭代器类型是双向迭代器,而list的迭代器类型就是双向迭代器,所以list也可以使用<algorithm>中的reverse
在这里插入图片描述

void test4()
{list<int> lt{ 1,2,3,4,5,6 };lt.reverse();reverse(lt.begin(), lt.end());
}



sort

void sort();

作用是排序,底层是归并
<algorithm>中也有sort函数,但是对于list来说,想要排序,只能使用list库中的sort函数,不能使用<algorithm>中也有sort

因为list的迭代器类型是双向迭代器,而<algorithm>中的sort的参数迭代器的类型是随机迭代器,所以list不能使用<algorithm>中的sort函数。

其实这里的sort意义不大,因为相对于<algorithm>中的sort效率低(list中的sort底层使用的是归并,<algorithm>中的sort使用的是快排)
而唯一的意义是:方便,数据量小了可以拍,但是数据量再大,就不要使用list中的sort

如果想要排序,完全可以把list中的数据拷贝到vector中,然后排vector,排序完之后再把数据拷贝会list

void test5()
{list<int> lt{ 5,7,3,9,1,0,4,7,8,9,4, };vector<int> v;//将数据从list拷贝到vectorfor (auto e : lt){v.push_back(e);}//在vector中排序reverse(v.begin(), v.end());//再把数据从vector拷贝到list中for (auto e : v){lt.push_back(e);}
}



unique

void unique();

作用是去重,但是需要先排序

void test6()
{list<int> lt{2,6,5,2,2,2,2};lt.sort();lt.unique();// 5,6
}



remove

void remove (const value_type& val);

remove的作用是先找到所有val的位置,然后erase掉所有的val

void test6()
{list<int> lt{1,2,3,4,5,6,6,7,8};//移除元素6lt.remove(6);//1,2,3,4,5,7,8
}



splice


void splice (iterator position, list& x);void splice (iterator position, list& x, iterator i);void splice (iterator position, list& x, iterator first, iterator last);

splice的作用是转移节点

  • void splice (iterator position, list& x),将x链表中的所有元素转移到position位置
  • void splice (iterator position, list& x, iterator i),将x链表中i位置的元素转移到position位置
  • void splice (iterator position, list& x, iterator first, iterator last),将x链表中[first,last)中的元素转移到position位置
void test7()
{list<int> lt1{ 1,2,3,4,5,6,7 };list<int> lt2{ 0,0 };lt2.splice(++lt2.begin(), lt1);for (auto e : lt1){cout << e << " ";}//lt1中的元素转移空了cout << endl;for (auto e : lt2){cout << e << " ";}//0 1 2 3 4 5 6 7 0cout << endl;list<int> lt3{ 1,2,3,4,5,6,7 };list<int> lt4{ 0,0 };lt4.splice(++lt4.begin(), lt3, ++lt3.begin());for (auto e : lt3){cout << e << " ";}//1 3 4 5 6 7cout << endl;for (auto e : lt4){cout << e << " ";}//0 2 0cout << endl;list<int> lt5{ 1,2,3,4,5,6,7 };list<int> lt6{ 0,0 };lt6.splice(++lt6.begin(), lt5,++++lt5.begin(), --lt5.end());for (auto e : lt5){cout << e << " ";}//1 2 7cout << endl;for (auto e : lt6){cout << e << " ";}//0 3 4 5 6 0cout << endl;
}

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

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

相关文章

安全学习DAY18_信息打点-APP资产搜集

信息打点-APP资产&静态提取&动态抓包&动态调试 文章目录 信息打点-APP资产&静态提取&动态抓包&动态调试本节知识&思维导图本节使用到的链接&工具 如何获取目标APP从名称中获取APP从URL获取APP APP搜集资产信息APP提取信息分类信息提取方式信息…

怎么管理运营私域流量?

私域流量管理是当今企业运营的重要议题&#xff0c;对于企业发展和品牌建设具有不可忽视的作用。然而&#xff0c;管理私域流量并不是一项轻松的任务&#xff0c;需要我们采取科学有效的措施&#xff0c;才能取得良好的效果。 首先&#xff0c;私域流量管理需要建立清晰的目标。…

Linux系统安全——NAT(SNAT、DNAT)

目录 NAT SNAT SNAT实际操作 DNAT DNAT实际操作 NAT NAT: network address translation&#xff0c;支持PREROUTING&#xff0c;INPUT&#xff0c;OUTPUT&#xff0c;POSTROUTING四个链 请求报文&#xff1a;修改源/目标IP&#xff0c; 响应报文&#xff1a;修改源/目标…

HTTP 握手过程

HTTP 握手过程 TCP 建立连接 3 次握手 客户端请求连接服务器服务器响应成功客户端回应服务器准备开始连接 TCP 结束连接 4 次挥手 客户端向服务器发送&#xff0c;断开请求服务器向客户端发送&#xff0c;还有数据没有传输完毕&#xff0c;请稍等服务器向客户端发送&#x…

基于微信小程序的中医体质辨识文体活动的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于微信小程序的中医体质辨识文体活动的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java s…

解决Pandas KeyError: “None of [Index([...])] are in the [columns]“问题

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

java八股文面试[JVM]——JVM参数

参考&#xff1a;JVM学习笔记&#xff08;一&#xff09;_卷心菜不卷Iris的博客-CSDN博客 堆参数调优入门 jdk1.7&#xff1a; jdk1.8&#xff1a; 面试题&#xff1a;给定-Xms Xmx -Xmn 问 最大的eden区域是多少M。 常用JVM参数 怎么对jvm进行调优&#xff1f;通过参数配…

百度商业AI 技术创新大赛赛道二:AIGC推理性能优化TOP10之经验分享

朋友们&#xff0c;AIGC性能优化大赛已经结束了&#xff0c;看新闻很多队员已经完成了答辩和领奖环节&#xff0c;我根据内幕人了解到&#xff0c;比赛的最终代码及结果是不会分享出来的&#xff0c;因为办比赛的目的就是吸引最优秀的代码然后给公司节省自己开发的成本&#xf…

怎样做好数字营销呢?

2023 年&#xff0c;数字营销将随着新技术、趋势和消费者行为的不断发展而不断发展。要在 2023 年在数字营销领域取得成功&#xff0c;请考虑以下策略&#xff1a; 1.内容质量和个性化&#xff1a; 专注于制作与目标受众产生共鸣的高质量且相关的内容。 根据用户偏好、行为和…

k8s ingress (二)

k8s ingress (二) Ingress介绍 在前面课程中已经提到&#xff0c;Service对集群之外暴露服务的主要方式有两种&#xff1a;NodePort和LoadBalancer&#xff0c;但是这两种方式&#xff0c;都有一定的缺点&#xff1a; NodePort方式的缺点是会占用很多集群机器的端口&#xff0…

【高危】Apache Airflow Spark Provider 任意文件读取漏洞 (CVE-2023-40272)

漏洞描述 Apache Airflow Spark Provider是Apache Airflow项目的一个插件&#xff0c;用于在Airflow中管理和调度Apache Spark作业。 受影响版本中&#xff0c;在JDBC连接时&#xff0c;由于没有对conn_prefix参数做验证&#xff0c;允许输入"?"来指定参数。攻击者…

2023 网络建设与运维 X86架构计算机操作系统安装与管理题解

任务描述: 随着信息技术的快速发展,集团计划2023年把部分业务由原有的X86架构服务器上迁移到ARM架构服务器上,同时根据目前的部分业务需求进行了部分调整和优化。 一、X86架构计算机操作系统安装与管理 1.PC1系统为ubuntu-desktop-amd64系统(已安装,语言为英文),登录用户…

Java调用高德地图API根据详细地址获取经纬度

步骤一&#xff1a;注册高德开发者账号并创建应用 访问高德开放平台https://lbs.amap.com/ 登录后&#xff0c;在控制台中创建一个应用&#xff0c;获取生成的应用key。这个key将用于访问高德地图API。 步骤二&#xff1a;使用Java发送HTTP请求获取经纬度 您可以使用Java…

kafka-python 消费者消费不到消息

排除步骤1&#xff1a; 使用group_id”consumer_group_id_001“ 和 auto_offset_reset"earliest" from kafka import KafkaConsumerconsumer KafkaConsumer(bootstrap_servers["dev-kafka01.test.xxx.cloud:9092"],enable_auto_commitTrue, auto_commit…

什么是雨量气象站?

过多的强降水会造成重大自然灾害&#xff0c;给我们的生活带来很大影响&#xff0c;实时监测降雨信息&#xff0c;能够及时发布气象预警&#xff0c;防范可能因强降水引起的山洪、泥石流等自然灾害&#xff0c;保护人民群众生命财产安全&#xff0c;提高防灾减灾能力。 雨量气…

Python搭建http文件服务器实现手机电脑文件传输功能

第一种代码的界面如下&#xff1a;&#xff08;有缺点&#xff0c;中文乱码&#xff09; # !/usr/bin/env python3 # -*- coding:utf-8 _*-"""Simple HTTP Server With Upload. python -V3.6 This module builds on http.server by implementing the standard G…

华为星闪,一项将 “ 更稳 WiFi ” 和 “ 更好蓝牙 ” 融合起来的通信标准

兼顾多用途和专业化的 AI 大模型、移除安卓代码的 HarmonyOS NEXT 、给折叠屏应用提供适配方向的《 折叠屏/平板应用体验评估标准 》。。。 不过除了这些比较贴近我们普通用户&#xff0c;容易讲清楚的东西&#xff0c;华为还官宣了一个大家可能没注意的黑科技&#xff1a; 星…

TCP性能机制

延迟应答 为什么有延迟应答 发送方如果长时间没有收到ACK应答&#xff0c;则会触发超时重传机制&#xff0c;重新发送数据包。但如果接收数据的主机立刻返回ACK应答, 这时候返回的窗口可能比较小&#xff0c;发送方一次只能发少量数据&#xff0c;效率较低。 举个例子理解一…

【深度学习-图像识别】使用fastai对Caltech101数据集进行图像多分类(50行以内的代码就可达到很高准确率)

文章目录 前言fastai介绍数据集介绍 一、环境准备二、数据集处理1.数据目录结构2.导入依赖项2.读入数据3.模型构建3.1 寻找合适的学习率3.2 模型调优 4.模型保存与应用 总结人工智能-图像识别 系列文章目录 前言 fastai介绍 fastai 是一个深度学习库&#xff0c;它为从业人员…

Spring Boot实践八--用户管理系统

一&#xff0c;技术介绍 技术选型功能说明springboot是一种基于 Spring 框架的快速开发应用程序的框架&#xff0c;它的主要作用是简化 Spring 应用程序的配置和开发&#xff0c;同时提供一系列开箱即用的功能和组件&#xff0c;如内置服务器、数据访问、安全、监控等&#xf…