STL list使用

2023-11-20

List 容器

list是C++标准模版库(STL,Standard Template Library)中的部分内容。实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。

使用list容器之前必须加上<vector>头文件:#include<list>;

list属于std命名域的内容,因此需要通过命名限定:using std::list;也可以直接使用全局的命名空间方式:using namespace std;

构造函数

    list<int> c0; //空链表

  list<int> c1(3); //建一个含三个默认值是0的元素的链表

  list<int> c2(5,2); //建一个含五个元素的链表,值都是2

  list<int> c4(c2); //建一个c2的copy链表

  list<int> c5(c1.begin(),c1.end()); c5含c1一个区域的元素[_First, _Last)。

成员函数

c.begin()      返回指向链表第一个元素的迭代器。

c.end()      返回指向链表最后一个元素之后的迭代器。

1     list<int> a1{1,2,3,4,5};
2     list<int>::iterator it;
3     for(it = a1.begin();it!=a1.end();it++){
4         cout << *it << "\t";
5     }
6     cout << endl;

c.rbegin()      返回逆向链表的第一个元素,即c链表的最后一个数据。

c.rend()      返回逆向链表的最后一个元素的下一个位置,即c链表的第一个数据再往前的位置。

1     list<int> a1{1,2,3,4,5};
2     list<int>::reverse_iterator it;
3     for(it = a1.rbegin();it!=a1.rend();it++){
4         cout << *it << "\t";
5     }
6     cout << endl;

operator=      重载赋值运算符。

1     list<int> a1 {1,2,3,4,5},a2;
2     a2 = a1;
3     list<int>::iterator it;
4     for(it = a2.begin();it!=a2.end();it++){
5         cout << *it << endl;
6     }

c.assign(n,num)      将n个num拷贝赋值给链表c。

c.assign(beg,end)      将[beg,end)区间的元素拷贝赋值给链表c。

 1     int a[5] = {1,2,3,4,5};
 2     list<int> a1;
 3     list<int>::iterator it;
 4     a1.assign(2,10);
 5     for(it = a1.begin();it!=a1.end();it++){
 6         cout << *it << " ";
 7     }
 8     cout << endl;
 9     a1.assign(a,a+5);
10     for(it = a1.begin();it!=a1.end();it++){
11         cout << *it << " ";
12     }
13     cout << endl;

c.front()      返回链表c的第一个元素。

c.back()      返回链表c的最后一个元素。

1     list<int> a1{1,2,3,4,5};
2     if(!a1.empty()){
3         cout << "the first number is:" << a1.front() << endl;
4         cout << "the last number is:" << a1.back() << endl;
5     }

c.empty()  判断链表是否为空。

1     list<int> a1{1,2,3,4,5};
2     if(!a1.empty())
3         cout << "a1 is not empty" << endl;
4     else
5         cout << " a1 is empty" << endl;

c.size()      返回链表c中实际元素的个数。

1     list<int> a1{1,2,3,4,5};
2     cout << a1.size() << endl;

c.max_size()      返回链表c可能容纳的最大元素数量。

1     list<int> a1{1,2,3,4,5};
2     cout << a1.max_size() << endl;

c.clear()      清除链表c中的所有元素。

 1     list<int> a1{1,2,3,4,5};
 2     list<int>::iterator it;
 3     cout << "clear before:";
 4     for(it = a1.begin();it!=a1.end();it++){
 5         cout << *it << "\t";
 6     }
 7     cout << endl;
 8     a1.clear();
 9     cout << "clear after:";
10     for(it = a1.begin();it!=a1.end();it++){
11         cout << *it << "\t";
12     }
13     cout << endl;

c.insert(pos,num)      在pos位置插入元素num。

c.insert(pos,n,num)      在pos位置插入n个元素num。

c.insert(pos,beg,end)      在pos位置插入区间为[beg,end)的元素。

 1     list<int> a1{1,2,3,4,5};
 2     list<int>::iterator it;
 3     cout << "insert before:";
 4     for(it = a1.begin();it!=a1.end();it++){
 5         cout << *it << " ";
 6     }
 7     cout << endl;
 8     
 9     a1.insert(a1.begin(),0);
10     cout << "insert(pos,num) after:";
11     for(it = a1.begin();it!=a1.end();it++){
12         cout << *it << " ";
13     }
14     cout << endl;
15     
16     a1.insert(a1.begin(),2,88);
17     cout << "insert(pos,n,num) after:";
18     for(it = a1.begin();it!=a1.end();it++){
19         cout << *it << " ";
20     }
21     cout << endl;
22 
23     int arr[5] = {11,22,33,44,55};
24     a1.insert(a1.begin(),arr,arr+3);
25     cout << "insert(pos,beg,end) after:";
26     for(it = a1.begin();it!=a1.end();it++){
27         cout << *it << " ";
28     }
29     cout << endl;

c.erase(pos)    删除pos位置的元素。

 1     list<int> a1{1,2,3,4,5};
 2     list<int>::iterator it;
 3     cout << "erase before:";
 4     for(it = a1.begin();it!=a1.end();it++){
 5         cout << *it << " ";
 6     }
 7     cout << endl;
 8     a1.erase(a1.begin());
 9     cout << "erase after:";
10     for(it = a1.begin();it!=a1.end();it++){
11         cout << *it << " ";
12     }
13     cout << endl;

c.push_back(num)      在末尾增加一个元素。

c.pop_back()      删除末尾的元素。

c.push_front(num)      在开始位置增加一个元素。

c.pop_front()      删除第一个元素。

 1     list<int> a1{1,2,3,4,5};
 2     a1.push_back(10);
 3     list<int>::iterator it;
 4     cout << "push_back:";
 5     for(it = a1.begin();it!=a1.end();it++){
 6         cout << *it << " ";
 7     }
 8     cout << endl;
 9     
10     a1.pop_back();
11     cout << "pop_back:";
12     for(it = a1.begin();it!=a1.end();it++){
13         cout << *it << " ";
14     }
15     cout << endl;
16     
17     a1.push_front(20);
18     cout << "push_front:";
19     for(it = a1.begin();it!=a1.end();it++){
20         cout << *it << " ";
21     }
22     cout << endl;
23     
24     a1.pop_front();
25     cout << "pop_front:";
26     for(it = a1.begin();it!=a1.end();it++){
27         cout << *it << " ";
28     }
29     cout << endl;

resize(n)      从新定义链表的长度,超出原始长度部分用0代替,小于原始部分删除。

resize(n,num)            从新定义链表的长度,超出原始长度部分用num代替。

 1     list<int> a1{1,2,3,4,5};
 2     a1.resize(8);
 3     list<int>::iterator it;
 4     cout << "resize(n):";
 5     for(it = a1.begin();it!=a1.end();it++){
 6         cout << *it << " ";
 7     }
 8     cout << endl;
 9     
10     a1.resize(10, 10);
11     cout << "resize(n,num):";
12     for(it = a1.begin();it!=a1.end();it++){
13         cout << *it << " ";
14     }
15     cout << endl;

c1.swap(c2);      将c1和c2交换。

swap(c1,c2);      同上。

 1     list<int> a1{1,2,3,4,5},a2,a3;
 2     a2.swap(a1);
 3     list<int>::iterator it;
 4     cout << "a2.swap(a1):";
 5     for(it = a2.begin();it!=a2.end();it++){
 6         cout << *it << " ";
 7     }
 8     cout << endl;
 9     
10     swap(a3,a2);
11     cout << "swap(a3,a2):";
12     for(it = a3.begin();it!=a3.end();it++){
13         cout << *it << " ";
14     }
15     return 0;

c1.merge(c2)      合并2个有序的链表并使之有序,从新放到c1里,释放c2。

c1.merge(c2,comp)      合并2个有序的链表并使之按照自定义规则排序之后从新放到c1中,释放c2。

 1     list<int> a1{1,2,3},a2{4,5,6};
 2     a1.merge(a2);
 3     list<int>::iterator it;
 4     cout << "a1.merge(a2):";
 5     for(it = a1.begin();it!=a1.end();it++){
 6         cout << *it << " ";
 7     }
 8     cout << endl;
 9     
10     a2.merge(a1,[](int n1,int n2){return n1>n2;});
11     cout << "a2.merge(a1,comp):";
12     for(it = a2.begin();it!=a2.end();it++){
13         cout << *it << " ";
14     }
15     cout << endl;

c1.splice(c1.beg,c2)      将c2连接在c1的beg位置,释放c2

1     list<int> a1{1,2,3},a2{4,5,6};
2     a1.splice(a1.begin(), a2);
3     list<int>::iterator it;
4     cout << "a1.merge(a2):";
5     for(it = a1.begin();it!=a1.end();it++){
6         cout << *it << " ";
7     }
8     cout << endl;

c1.splice(c1.beg,c2,c2.beg)      将c2的beg位置的元素连接到c1的beg位置,并且在c2中施放掉beg位置的元素

1     list<int> a1{1,2,3},a2{4,5,6};
2     a1.splice(a1.begin(), a2,++a2.begin());
3     list<int>::iterator it;
4     cout << "a1.merge(a2):";
5     for(it = a1.begin();it!=a1.end();it++){
6         cout << *it << " ";
7     }
8     cout << endl;
9     return 0;

c1.splice(c1.beg,c2,c2.beg,c2.end)      将c2的[beg,end)位置的元素连接到c1的beg位置并且释放c2的[beg,end)位置的元素

1     list<int> a1{1,2,3},a2{4,5,6};
2     a1.splice(a1.begin(),a2,a2.begin(),a2.end());
3     list<int>::iterator it;
4     cout << "a1.merge(a2):";
5     for(it = a1.begin();it!=a1.end();it++){
6         cout << *it << " ";
7     }
8     cout << endl;
9     return 0;

remove(num)             删除链表中匹配num的元素。

1     list<int> a1{1,2,3,4,5};
2     a1.remove(3);
3     list<int>::iterator it;
4     cout << "remove():";
5     for(it = a1.begin();it!=a1.end();it++){
6         cout << *it << " ";
7     }
8     cout << endl;

remove_if(comp)       删除条件满足的元素,参数为自定义的回调函数。

1     list<int> a1{1,2,3,4,5};
2     a1.remove_if([](int n){return n<3;});
3     list<int>::iterator it;
4     cout << "remove_if():";
5     for(it = a1.begin();it!=a1.end();it++){
6         cout << *it << " ";
7     }
8     cout << endl;

reverse()       反转链表

1     list<int> a1{1,2,3,4,5};
2     a1.reverse();
3     list<int>::iterator it;
4     cout << "reverse:";
5     for(it = a1.begin();it!=a1.end();it++){
6         cout << *it << " ";
7     }
8     cout << endl;

unique()       删除相邻的元素

1     list<int> a1{1,1,3,3,5};
2     a1.unique();
3     list<int>::iterator it;
4     cout << "unique:";
5     for(it = a1.begin();it!=a1.end();it++){
6         cout << *it << " ";
7     }
8     cout << endl;
9     return 0;

c.sort()       将链表排序,默认升序

c.sort(comp)       自定义回调函数实现自定义排序

 1     list<int> a1{1,3,2,5,4};
 2     a1.sort();
 3     list<int>::iterator it;
 4     cout << "sort():";
 5     for(it = a1.begin();it!=a1.end();it++){
 6         cout << *it << " ";
 7     }
 8     cout << endl;
 9     
10     a1.sort([](int n1,int n2){return n1>n2;});
11     cout << "sort(function point):";
12     for(it = a1.begin();it!=a1.end();it++){
13         cout << *it << " ";
14     }
15     cout << endl;

重载运算符

operator==

operator!=

operator<

operator<=

operator>

operator>=

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL list使用 的相关文章

  • “挖矿”【题解】

    题目 题目描述 有N名矿工在挖矿 工厂预先给第i名矿工支付了M i 元工资 他每挖一吨矿需要消费K i 元 如果他手头余下的钱不足K i 元 他就停止挖矿 他每挖一吨矿 工厂会立即奖励他2元钱 奖励的钱也可以用 于挖矿的消费 给出矿工的信息
  • Design Compiler (八)——DC的逻辑综合与优化

    对进行时序路径 工作环境 设计规则等进行约束完成之后 DC就可以进行综合 优化时序了 DC的优化步骤将在下面进行讲解 然而 当普通模式下不能进行优化的 就需要我们进行编写脚本来改进DC的优化来达到时序要求 理论部分以逻辑综合为主 不涉及物理
  • 基于STM32F1系列芯片的OV7670颜色,形状识别

    在用ov7670做颜色识别的时候遇到一些问题 查阅很多资料才弄明白 遂整理一下 一 腐蚀中心 int SearchCenter uint16 t x uint16 t y const TARGET CONDITION t condition
  • #挑战Open AI!马斯克宣布成立xAI,你怎么看?# 马斯克的xAI:充满困难与希望

    文章目录 1 什么是xAI公司 2 xAI公司的图标 3 反AI斗士 马斯克进军AI 期待与挑战并存 3 1 关于马斯克 3 2 这位 反AI斗士 3 3 我的看法 3 4 可能会遇到的困难与优势 3 5 蓄谋已久的马斯克 3 6 xAI
  • python爬取基金_Python爬虫爬取基金数据

    1 程序结构介绍 代码结构图 代码结构图 代码目录结构 代码目录结构 结果图 结果图 2 数据源网站 3 GitHub地址 4 文件代码 main py from get fund code import from get fund dat
  • easyExcel实战:(五)写Excel设置excel的样式

    一 主要是设置Excel的字体大小和颜色 目前还不支持单元格内容居中和自动适应宽度 定义Excel正文背景颜色 TableStyle tableStyle new TableStyle tableStyle setTableContentB
  • mq的基本介绍和基本用法

    1 什么是MQ 有什么用 MQ 是message queue 消息队列 也叫消息中间件 遵守JMS java message service 规范的一种软件 同时还有另一个叫AMQP的应用层协议 语言无关性不受产品 语言等限制 rabbit
  • Java按顺序打印数字的每一位详解

    题目要求 输入一个数字 按顺序打印一个数字的每一位 例如 1234 打印出 1 2 3 4 用递归实现 实现代码 import java util Scanner public class blank40 public static voi
  • aarch64架构CPU的docker中ubuntu18.04,20.04,22.04等系统apt update均报错的原因

    宿主及环境为aarch64的CPU的Ubuntu18 04 docker版本为自带的19 03 6 对于Ubuntu14 04 16 04 18 04这个原因很乌龙 之前百度搜索结果也都不对 最终原因竟然只是因为网络问题 早上8点左右我到公
  • PySide2按钮传递参数以及*args,**kargs的含义

    1 PySide2按钮传递参数 lambda 表达式 self set priV on set clicked connect lambda self set priV con 1 def set priV con self valueV
  • Communications link failure问题解决方案摸索

    性能测试发现了Communications link failure错误 搜寻了网络上的好多种解决方案 记录总结一下 错误信息 Communications link failure The last packet sent success
  • 1037 在霍格沃茨找零钱

    1037 在霍格沃茨找零钱 20 20 分 如果你是哈利 波特迷 你会知道魔法世界有它自己的货币系统 就如海格告诉哈利的 十七个银西可 Sickle 兑一个加隆 Galleon 二十九个纳特 Knut 兑一个西可 很容易 现在 给定哈利应付
  • python读取文件时出现\ufeff非法字符的处理思路

    现象 系统环境 操作系统 Microsoft Windows 10 家庭中文版 10 0 1904 Python Python 3 8 8 问题 如下图所示 利用python读取文件后 在对字符串进行处理时 会出现 ufeff字符 这对基于
  • python读取excel成绩表,并设置柱状图

    目录 1 导入相关的包 2 读取excel文件 提取语文的数据 3 画柱状图的代码 4 完整代码 5 效果图 1 导入相关的包 import pandas as pd import matplotlib pyplot as plt 2 读取
  • 网管员牢记 10种较为常见的服务器管理错误

    网管员牢记 10种较为常见的服务器管理错误 网络管理阶层的工作就是保证网络的正常工作 从而使得职工们的工作不被打断 可问题在于事物并非总是按照理想状况发展 事实上经常会出现平地起风波的状况 其间有许多原因 这里我们只讨论10种较为常见的网管
  • angular 4 httpClient 数据访问

    服务里 是用来请求api的一个模块 使用httpClient服务请求数据常用方法如下 http get url subscribe export class ApiService 登录 一种是url是不变的 只需传参 login userN
  • VS项目属性的一些配置项的总结(important)

    以下内容为 原创 转载 首先 解决方案和项目文件夹包含关系 c 项目 VS解决方案和各个项目文件夹以及解决方案和各个项目对应的配置文件包含关系 假设新建一个项目ssyy 解决方案起名fangan 注意解决方案包括项目 此时生成的最外层目录为
  • 性能诊断定位之内存问题排查(四):CentOS7系统中,JVM内存诊断

    目录 1 要求 2 处理思路 3 示例演示 CentOS7 环境中 3 1 环境工具 3 2 操作步骤 3 2 1 JForum环境配置 配置在tomcat中 启动Tomcat 3 2 2 编写JMeter脚本 脚本的编写和运行 在win1
  • C#实现FTP文件夹下载功能【转载】

    网上有很多FTP单个文件下载的方法 前段时间需要用到一个FTP文件夹下载的功能 于是找了下网上的相关资料结合MSDN实现了一段FTP文件夹下载的代码 实现的思路主要是通过遍历获得文件夹下的所有文件 当然 文件夹下可能仍然存在文件夹 这样就需
  • 禁用CEF跟随系统的DPI缩放

    方法1 为程序添加启动参数 high dpi support 1 force device scale factor 1 1 在桌面上右键Chrome图标 选择属性 2 在目标一栏中增加自定义参数 force device scale fa

随机推荐

  • 文字图像转换的创新技术

    随着科技的快速发展 人工智能 AI 已经逐渐融入我们的日常生活 而 生成式 AI 更是引领着 AI 领域的新一轮革命 生成式 AI 是一种能够从文字描述中提取信息 并将其转化为图像或其他形式内容的技术 如今 这种技术正在逐渐改变我们与计算机
  • 线程生命周期(状态)

    1 线程生命周期 状态 当线程被创建并启动以后 它既不是一启动就进入了执行状态 也不是一直处于执行状态 在线程的生命周期中 它要经过新建 New 就绪 Runnable 运行 Running 阻塞 Blocked 和死亡 Dead 5 种状
  • python 字符串大小写转换 其它不变_ython字符串大小写转换(3种)函数及用法

    Python 中 为了方便对字符串中的字母进行大小写转换 字符串变量提供了 3 种方法 分别是 title lower 和 upper https www furuihua cn shenzhen longhua Python title
  • springboot注解--基础--01--注解

    springboot注解 基础 01 注解 https blog csdn net zhou920786312 article details 130844305 https blog csdn net zhou920786312 arti
  • vue启动报错vue-cli-service: command not found

    要配置环境变量以便能够在任意位置使用 Vue CLI 你可以按照以下步骤操作 确保已经全局安装了 Vue CLI 如果尚未安装 请使用以下命令进行全局安装 Copy Code npm install g vue cli 打开命令行终端 并输
  • vue实现拍照人脸识别功能带人脸选中框

    前言 实现打开摄像头 并识别人脸 实现效果 实现步骤 一 安装 1 官网下载 tracking js 的代码包官网入口 2 npm下载 执行命令 cnpm install tracking save 二 demo案例代码
  • nexus扩容后,代理功能出错,重启失败原因排查

    用nexus做仓库 其中有yum maven docker helm 当时搭建的时候觉得100g磁盘空间够用了 结果后期大家都在使用 不到俩月就磁盘占满了 无奈知道将虚拟机的磁盘扩容 扩容后nexus页面貌似一切正常 偶然发现 yum in
  • Spring Boot笔记

    文章目录 一 Spring Boot 入门 1 Spring Boot 简介 2 微服务 3 环境准备 1 MAVEN设置 2 IDEA设置 4 Spring Boot HelloWorld 1 创建一个maven工程 jar 2 导入sp
  • 在有机器学习和深度学习的基础上,如何自学AutoML算法?

    作者 FedAI联邦学习 链接 https www zhihu com question 334021426 answer 840727058 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 AutoML技术
  • POI实现Word文件转PDF

    需求 采用spire doc生成word文件后 需要加一个预览PDF的功能 可以直接采用POI对docx文件进行转换处理 public static void main String args throws Exception String
  • 遗传算法的有趣实践

    源码 先放上我的源码链接 https github com AIjugg Genetic Algorithm git 自己思考加纯手写的代码 有兴趣的同学可以拿去玩玩 前言 生物进化是一个有趣的话题 人是怎么从人猿进化到的人 长颈鹿的脖子为
  • 基于Java SSM+layui+mysql实现的图书借记管理系统源代码+数据库

    介绍 本项目使用的技术栈是SSM layui mysql 服务器使用的是tomcat 其中书籍图片存放的位置需要先在tomcat根目录下conf setting xml中配置虚拟路径 本项目配置的是D upload 完整代码下载地址 图书借
  • java mapper.readtree_java - 杰克逊的readValue和readTree:何时使用哪个? - 堆栈内存溢出...

    我刚刚开始使用Jackson JSON库 杰克逊是一个非常强大的库 但它有一个非常广泛的API 很多事情可以通过多种方式完成 这使得很难在杰克逊找到自己的方式 如何知道什么是正确 最好的做事方式 我为什么要使用这个解决方案 String j
  • 笔试题8:一些常见的转义字符

    a 响铃 b 退格 f 换页 n 换行 r 回车 t 水平制表 v 垂直制表 反斜杠 文号字符 单引号字符 双引号字符 0 空字符 Null ddd 任意字符 三位八进制数 xhh 任意字符二位十进制数
  • 悟空CRM / 72crm-11.0-Spring部署

    目录 悟空CRM部署 悟空CRM目录结构 悟空CRM使用的主要技术栈 使用说明 一 前置环境 二 JDK1 8 Maven3 5安装 三 安装Mysql数据库 四 安装Elasticsearch 6 8 6 五 安装Redis 六 Naco
  • 如何实现Linux系统和Windows系统之间的文件传输

    一 FTP的概念 FTP服务 用来传输文件的协议 FTP是一种上传和下载用的软件 用户可以通过它把自己的PC机与运行FTP协议的服务器相连 访问服务器上的程序和信息 与大多数Internet服务一样 FTP也是一个客户机 服务器系统 用户通
  • 物联网产业到2023年连接数将突破20亿

    导读 随着经济社会数字化转型和智能升级步伐加快 物联网逐渐成为新型基础设施的重要组成部分 近日 工信部等8部门联合印发 物联网新型基础设施建设三年行动计划 2021 2023年 下称 行动计划 明确到2023年底 在国内主要城市初步建成物联
  • web服务器推送技术

    传统模式的 Web 系统以客户端发出请求 服务器端响应的方式工作 不能满足很多现实应用的需求 譬如 监控系统 后台硬件温度 电压发生变化 即时通信系统 其它用户登录 发送信息 即时报价系统 后台数据库内容发生变化 即时信息系统 微博 说说实
  • leetcode -------414. 第三大的数 C语言版本

    目录 题目 解题思路 图解 代码 题目 414 第三大的数 给你一个非空数组 返回此数组中 第三大的数 如果不存在 则返回数组中最大的数 示例 1 输入 3 2 1 输出 1 解释 第三大的数是 1 示例 2 输入 1 2 输出 2 解释
  • STL list使用

    List 容器 list是C 标准模版库 STL Standard Template Library 中的部分内容 实际上 list容器就是一个双向链表 可以高效地进行插入删除元素 使用list容器之前必须加上