STL好难(4):list的使用

news2024/11/26 3:52:37

和列表很像

1.list的介绍

点击这里查看 list 的官方文档

list类似数据结构中的链表

  • 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  • 2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
  • 3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。
  • 4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
  • 5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)

2.list的常见构造 

构造函数 (constructor)接口说明
list (size_type n, const value_type& val = value_type())构造的list中包含n个值为val的元素
list()构造空的list
list (const list& x)拷贝构造函数
list (InputIterator first, InputIterator last)用[first, last)区间中的元素构造list
// 构造空的L1
list<int> L1; 

// L2中放4个值为100的元素                    
list<int> L2(4, 100);

// 用L2的[begin(), end())左闭右开的区间构造L3
list<int> L3(l2.begin(), l2.end());  

// 用L3拷贝构造L4
list<int> L4(l3);                    

3.list的遍历方式

🍉迭代器:

begin 获取一个字符的迭代器, end获取最后一个字符下一个位置的迭代器

#include<iostream>
#include<list>
using namespace std;

int main()
{
	list<int> lt; // 定义容器lt
 
	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
 
	// 使用迭代器访问数据
	list<int>::iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
 
	return 0;
}

🍉范围for:

底层也用迭代器实现的

int main()
{
	list<int> lt; // 定义容器lt
 
	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
 
	// 使用范围for访问数据
	for (auto a : lt)
	{
		cout << a << " ";
	}
	cout << endl;

	return 0;
}

4.list的迭代器:

🍉begin和end

通过 begin ()函数可以得到容器中第一个元素的正向迭代器

通过 end ()函数可以得到容器中最后一个元素的后一个位置的正向迭代器

#include<iostream>
#include<list>
using namespace std;

int main()
{
	list<int> lt; // 定义容器lt
 
	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
    
    //正向迭代器遍历容器
    list<int>::iterator it = lt.begin();
	//也可以用auto来自动识别:auto it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
 
	return 0;
}

 结果:

🍉rbegin和rend

通过 rbegin 函数可以得到容器中最后一个元素的反向迭代器

通过 rend 函数可以得到容器中第一个元素的前一个位置的反向迭代器

#include<iostream>
#include<list>
using namespace std;

int main()
{
	list<int> lt; // 定义容器lt
 
	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
    
    //反向迭代器遍历容器
    list<int>::reverse_iterator it = lt.rbegin();
	//也可以用auto来自动识别:auto it = lt.rbegin();
	while (it != lt.rend())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
 
	return 0;
}

 

🍉C++11加入的迭代器

cbegin和cend,是const修饰的迭代器

crbegin和crend,是const修饰的反向迭代器

5.list的空间扩容

🍉empty

判断链表是否为空,为空返回0,不为空,返回其他

如下面的例子:

int main()
{
	list<int> lt; 

	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);

    int sum = 0;
	while (!lt.empty())
	{
		sum += lt.front();
		lt.pop_front();
	}

	std::cout << "total: " << sum << '\n';

	return 0;
}

当链表不为空时,sum+=头结点的值,然后进行头删,计算链表的累加结果。

🍉size

用于计算链表的大小

int main()
{
	list<int> lt;

	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);

	std::cout << "size: " << lt.size() << '\n';

	return 0;
}

🍉max_size

返回链表可以容纳的最大元素数

6.list的元素访问:

函数声明接口说明
front返回 list 的第一个节点中值的引用
back返回 list 的最后一个节点中值的引用

7.list的元素修改:

官方文档内容:

 需要重点掌握的内容:

函数声明接口说明
push_front在list首元素前插入值为val的元素
pop_fornt删除list中第一个元素

push_back

在list尾部插入值为val的元素
pop_back删除list中最后一个元素
insert在list position 位置中插入值为val的元素
erase删除list position位置的元素
swap交换两个list中的元素
clear清空list中的有效元素

需要注意,list没有定义find函数,需要用库里面的find来进行查找

如下:在3的前面插入30

int main()
{
	list<int> lt;

	// 尾插5个数据
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);

	list<int>::iterator it = find(lt.begin(), lt.end(), 3);
	if (it != lt.end())
	{
		lt.insert(it, 30);
	}

	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	
	return 0;
}

8.list的一些操作:

splice:接合,将链表A结合到链表B的某个位置,注意这里不是拷贝过去,是真真正正的拿过去,接合后,链表A变为空

remove:就是find+erase,去除链表的一个元素,涉及到仿函数

unique:去重,也需要有序

merge:合并,两个有序链表合并,合并出来后依旧有序

sort:排序

        算法库里面已经提供了一个sort,为什么list里面还要提供一个sort
        

算法库里面的sort理论上可以传任何类型的参数

但是内部使用迭代器有要求,名字按时你要传随即迭代器

preverse:逆置list链表

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

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

相关文章

分布式操作系统期末复习(辽宁大学王龙主讲)包含往年期末题

目录 一、题目 1.1 简答题 1.2 综合题 二、题目答案 2.1 简答题目答案 2.2 综合题目答案 三、期末题型分值分布 3.2 题型和分值 一、题目 1.1 简答题 1什么是中间件 22.1&#xff08;22年期末考试第一题&#xff09; 2 什么是名称解析 23.1 3 描述一下客户和服务器…

【NLP】Word2Vec原理和认识

一、介绍 Word2Vec是NLP领域的最新突破。Tomas Mikolov是捷克计算机科学家&#xff0c;目前是CIIRC&#xff08;捷克信息学&#xff0c;机器人和控制论研究所&#xff09;的研究员&#xff0c;是word2vec研究和实施的主要贡献者之一。词嵌入是解决NLP中许多问题不可或缺的一部分…

Vscosde中写html的速写规则和快捷键

目录 vsCode速写规则! enter 生成html框架ctrl / 注释生成html元素&#xff1a;直接写html&#xff0c;enter直接生成 并且添加内容批量生成> 元素嵌套 同级生成每个元素都有的属性. class # id样式放入css中 link 连接快速使用样式优先级 vsCode速写规则 ! enter 生成h…

运输层:TCP的运输连接管理

1.运输层&#xff1a;TCP的运输连接管理 笔记来源&#xff1a; 湖科大教书匠&#xff1a;TCP的连接建立 湖科大教书匠&#xff1a;TCP的连接释放 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 TCP是面向连接的协议&#xff0c;它基于运输连接来传…

易查分怎么上传成绩?学会这个技巧,轻松搞定

当使用易查分制作查询系统时&#xff0c;许多老师可能对于如何上传成绩感到困惑。有时候&#xff0c;导入成绩到易查分系统后&#xff0c;信息可能无法完全显示&#xff0c;而且也很难找到错误的原因。因此&#xff0c;今天我将与老师们分享一下易查分上传成绩的方法。这个技巧…

word自动编号变黑块的亲测解决方案

具体问题如下&#xff1a; 出现这种情况就是word的自动编号字体出错&#xff0c;可以在word中运行脚本来解决&#xff1a; Sub repair()For Each templ In ActiveDocument.ListTemplates For Each lev In templ.ListLevels lev.Font.Reset Next lev Next templEnd Sub代码如上…

二十三种设计模式第十三篇--享元模式

享元模式&#xff0c;主要就是一种池化方案&#xff0c;主要用于创建对象的数量&#xff0c;以减少内存占用和提高性能。这种类型的设计模式属于结构型模式&#xff0c;它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式&#xff0c;尝试重用现有的同类对象&a…

ros2 c++实现JY_95T IMU解算三轴 加速度 角速度 欧拉角 磁力计 四元数

起因&#xff0c;机器人建图导航程序需要做里程计 imu数据融合&#xff0c;需要填充imu数据&#xff0c;但对imu填充的数据一直不是很了解&#xff0c;并且正在学习c的类与对象&#xff0c;新近入手了一款JY_95T IMU&#xff0c;没有ros2的c实现&#xff0c;所幸就拿它练练手&a…

Cocos2dx学习笔记:浅谈游戏内的适配方案

前言 本篇在讲什么 Cocos2dx中的适配方案 本篇适合什么 适合初学Cocos的小白 本篇需要什么 对Lua语法有简单认知 依赖Cocos2dx3.15环境 依赖Sublime Text编辑器 依赖VS 2015编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手…

vue基于SpringBoot的智慧城市社区生活分类信息管理系统的设计与实现_2p760

表名&#xff1a;dongwuzhonglei 功能&#xff1a;动物种类 字段名称 类型 长度 字段说明 主键 默认值 id bigint 主键 主键 addtime timestamp 创建时间 CURRENT_TIMESTAMP dongwuzhonglei varchar 200 动物种类 …

防止video视频被下载的几种处理办法

1&#xff0c;video禁用下载功能 <video controlslist"nodownload"></video>2&#xff0c;隐藏鼠标右键&#xff0c;禁止复制链接 document.oncontextmenu function () {return false; }3&#xff0c;使用云点播等第三方播放控件&#xff0c;最好的话…

图像增强算法Retinex原理与实现详解

文章目录 1. 引言2. Retinex算法原理2.1 单尺度Retinex示例代码 2.2 多尺度Retinex示例代码 2.3 颜色恢复示例代码 2.4 最终图像处理代码示例 3. Retinex算法的Python实现4. 完结 1. 引言 图像增强是图像处理中的重要技术之一&#xff0c;它可以改善图像的亮度、对比度和颜色等…

微信开发者工具模拟器中不显示鼠标问题

前言 在使用微信开发者工具开发微信小程序时&#xff0c;使用到了第二屏幕&#xff0c;在第一屏幕上&#xff0c;微信开发者工具模拟器中&#xff0c;可以正常显示鼠标&#xff0c;而在第二屏幕上不显示鼠标。 解决方案&#xff1a; 方案1&#xff1a;设置指针轨迹&#xff…

【JMeter分布式压测连接Jenkins生成测试报告报错:Data exporter “html“ is unable to export data】

An error occurred: Data exporter “html” is unable to export data. Build step “Execute shell” marked build as failure 发生了一个错误:数据导出器“html”无法导出数据。 构建步骤“执行shell”将构建标记为失败 查看JMeter-master日志jmeter.log 发现是由于没有r…

基于springboot+vue的文物收藏系统(源代码+数据库+13000字论文)082

基于springbootvue的文物收藏系统(源代码数据库13000字论文)082 一、系统介绍 本项目前后端分离(本项目有ssmvue版本) 本系统分为管理员、用户两种角色 用户角色包含以下功能&#xff1a; 登录、文物查看、文物资料下载、文物收藏管理、文物维护管理、文物封存管理、个人中…

赛效:电子书可以转换成TXT吗

1&#xff1a;在“其他功能”菜单里点击“电子书转TXT”。 2&#xff1a;点击页面中间的号或者拖拽电子书上传。常规格式的电子书&#xff0c;都可以上传。 3&#xff1a;文件添加成功后&#xff0c;点击右下角的“开始转换”。 4&#xff1a;文件转换成功后&#xff0c;点击下…

Vue element admin git安装失败-2023年7月6日

Vue element admin-2023年7月6日 Vue element admin官网安装失败&#xff0c;是由于依赖包&#xff0c;所nodejs要求版本很低&#xff0c;导致和新版的18、16版本不兼容&#xff0c;git下安装失败。解决办法 Vue element admin官网 https://panjiachen.gitee.io/vue-element-a…

大数据的薪资怎么样?是真的很高么

既然提到了数据的问题&#xff0c;其实不妨看一下各大招聘平台在不同城市给出的薪资&#xff0c;百闻不如一见&#xff0c;自己真正看到了就知道能拿多少了。当然&#xff0c;是否能高薪&#xff0c;很大一部分还是取决于自身的能力的 猎聘大数据研究院发布了《2022未来人才就…

【yolov5】训练自己的数据集-实践笔记

【yolov5】训练自己的数据集-实践笔记 使用yolov5训练自己的数据集&#xff0c;以RSOD数据集为例&#xff0c;图像数量976&#xff0c;一共四类。 yolov5源码&#xff1a;https://github.com/ultralytics/yolov5 官网的代码会一直更新&#xff0c;相关依赖环境也会变&#xf…

嵌套和递归使用模板类

嵌套和递归使用模板类 模板栈模板数组栈中嵌套数组数组中嵌套栈数组中嵌套数组 模板栈 #pragma once #include <iostream> // 包含头文件。 using namespace std; // 指定缺省的命名空间。template<class DataType> class mystack2 { private:Data…