当前位置: 首页 > news >正文

STL-常用容器-list

1list基本概念

**功能:**将数据进行链式存储

链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
链表的组成:链表由一系列结点组成
结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
STL中的链表是一个双向循环链表
在这里插入图片描述
由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器

list的优点:

  • 采用动态存储分配,不会造成内存浪费和溢出
  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

list的缺点:

  • 链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大

List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。

总结:STL中List和vector是两个最常被使用的容器,各有优缺点

2 list构造函数

功能描述:

  • 创建list容器

函数原型:

  • list<T> lst; //list采用采用模板类实现,对象的默认构造形式:
  • list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。
  • list(n,elem); //构造函数将n个elem拷贝给本身。
  • list(const list &lst); //拷贝构造函数。
#include<iostream>
using namespace std;
#include<list>void printList(const list<int>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{list<int>L1;//添加数据L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//遍历printList(L1);//区间方式构造list<int>L2(L1.begin(), L1.end());printList(L2);//拷贝构造list<int>L3(L2);printList(L3);//n个nlemlist<int>L4(2, 100);printList(L4);}int main()
{test01();return 0;
}

总结:list构造方式同其他几个STL常用容器,熟练掌握即可

3 list 赋值和交换

功能描述:

  • 给list容器进行赋值,以及交换list容器

函数原型:

  • assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
  • assign(n, elem); //将n个elem拷贝赋值给本身。
  • list& operator=(const list &lst); //重载等号操作符
  • swap(lst); //将lst与本身的元素互换
#include<iostream>
using namespace std;
#include<list>void printList(const list<int>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{list<int>L1;//添加数据L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//遍历printList(L1);list<int>L2;L2 = L1;printList(L2);list<int>L3;L3.assign(L2.begin(), L2.end());list<int>L4;L4.assign(2, 100);
}void test02()
{list<int>L1;//添加数据L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);list<int>L2;L2.assign(4, 20);cout << "交换前:";printList(L1);printList(L2);L1.swap(L2);cout << "交换后:";printList(L1);printList(L2);
}int main()
{//test01();test02();return 0;
}

4 list 大小操作

功能描述:

  • 对list容器的大小进行操作

函数原型:

  • size(); //返回容器中元素的个数

  • empty(); //判断容器是否为空

  • resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

    ​ //如果容器变短,则末尾超出容器长度的元素被删除。

  • resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
    //如果容器变短,则末尾超出容器长度的元素被删除

#include<iostream>
using namespace std;
#include<list>void printList(const list<int>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{list<int>L1;//添加数据L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//遍历printList(L1);//判断容器是否为空if (L1.empty()){cout << "为空" << endl;}else{cout << "不空" << endl;cout << L1.size() << endl;}//重新指定大小L1.resize(6, 66);printList(L1);L1.resize(2);printList(L1);
}int main()
{test01();return 0;
}

总结:

  • 判断是否为空 — empty
  • 返回元素个数 — size
  • 重新指定个数 — resize

5 list 插入和删除

功能描述:

  • 对list容器进行数据的插入和删除

函数原型:

  • push_back(elem);//在容器尾部加入一个元素
  • pop_back();//删除容器中最后一个元素
  • push_front(elem);//在容器开头插入一个元素
  • pop_front();//从容器开头移除第一个元素
  • insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
  • insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
  • insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
  • clear();//移除容器的所有数据
  • erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
  • erase(pos);//删除pos位置的数据,返回下一个数据的位置。
  • remove(elem);//删除容器中所有与elem值匹配的元素。
#include<iostream>
using namespace std;
#include<list>void printList(const list<int>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{list<int>L;//尾插L.push_back(10);L.push_back(20);L.push_back(30);L.push_back(40);//头插L.push_front(100);L.push_front(200);printList(L);//尾删L.pop_back();printList(L);//头删L.pop_front();printList(L);//insertlist<int>::iterator it = L.begin();L.insert(++it, 66);printList(L);//删除it = L.begin();L.erase(it);printList(L);//移除L.push_back(22);printList(L);L.remove(22);printList(L);L.clear();printList(L);
}int main()
{test01();return 0;
}

总结:

  • 尾插 — push_back
  • 尾删 — pop_back
  • 头插 — push_front
  • 头删 — pop_front
  • 插入 — insert
  • 删除 — erase
  • 移除 — remove
  • 清空 — clear

6 list 数据存取

功能描述:

  • 对list容器中数据进行存取

函数原型:

  • front(); //返回第一个元素。
  • back(); //返回最后一个元素。
#include<iostream>
using namespace std;
#include<list>void test01()
{list<int>L1;//尾插L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//L[0] 不可以用[]访问list容器中的元素//L1.at(0) 不可以用at访问list容器中的元素//list 本身是一个链表,地址不连续,迭代器不支持随机访问cout << "第一个元素" << L1.front() << endl;cout << "最后一个元素" << L1.back() << endl;//验证迭代器不支持随机访问list<int>::iterator it = L1.begin();it++;//it=it+1 不支持}int main()
{test01();return 0;
}

总结:

  • list容器中不可以通过[]或者at方式访问数据
  • 返回第一个元素 — front
  • 返回最后一个元素 — back

7 list 反转和排序

功能描述:

  • 将容器中的元素反转,以及将容器中的数据进行排序

函数原型:

  • reverse(); //反转链表
  • sort(); //链表排序
#include<iostream>
using namespace std;
#include<list>
#include<algorithm>
void printList(const list<int>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}bool myCompare(int v1,int v2)
{return v1 > v2;
}void test01()
{list<int>L1;//尾插L1.push_back(20);L1.push_back(10);L1.push_back(60);L1.push_back(40);printList(L1);L1.reverse();printList(L1);L1.sort();printList(L1);//sort(L1.begin(), L1.end()); 所有不支持随机访问迭代器的容器,不可以用标准算法L1.sort(myCompare);printList(L1);
}int main()
{test01();return 0;
}

总结:

  • 反转 — reverse
  • 排序 — sort (成员函数)

8 排序案例

案例描述:将Person自定义数据类型进行排序,Person中属性有姓名、年龄、身高

排序规则:按照年龄进行升序,如果年龄相同按照身高进行降序

#include<iostream>
using namespace std;
#include<string>
#include <list>
class Person
{
public:Person(string name, int age, int h){this->_name = name;this->_age = age;this->_h = h;}string _name;int _age;int _h;
};bool comparePerson(Person& p1, Person& p2)
{if (p1._age == p2._age){return p1._h > p2._h;}return p1._age < p2._age;
}void test01()
{list<Person>L;Person p1("li", 20, 170);Person p2("yi", 18, 176);Person p3("ai", 17, 169);Person p4("wu", 22, 173);Person p5("hi", 20, 178);L.push_back(p1);L.push_back(p2);L.push_back(p3);L.push_back(p4);L.push_back(p5);for (list<Person>::const_iterator it = L.begin(); it != L.end(); it++){cout << "姓名:" << (*it)._name << " 年龄: " << it->_age << " 身高:" << it->_h << endl;;}cout << "--------------------" << endl;cout << "排序后" << endl;L.sort(comparePerson);for (list<Person>::const_iterator it = L.begin(); it != L.end(); it++){cout << "姓名:" << (*it)._name << " 年龄: " << it->_age << " 身高:" << it->_h << endl;;}
}int main()
{test01();return 0;
}

总结:

  • 对于自定义数据类型,必须要指定排序规则,否则编译器不知道如何进行排序

  • 高级排序只是在排序规则上再进行一次逻辑规则制定,并不复杂

相关文章:

STL-常用容器-list

1list基本概念 **功能&#xff1a;**将数据进行链式存储 链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成&#xff1a;链表由一系列结点组成 结点的组成&#xff1a;一个是存储…...

Lambda 架构

Lambda架构是一种用于构建可扩展、容错和实时数据处理系统的架构模式。 它由三个主要部分组成&#xff1a;批处理层&#xff08;Batch Layer&#xff09;、实时层&#xff08;Speed Layer&#xff09;和服务层&#xff08;Serving Layer&#xff09;。 Lambda架构旨在结合批处…...

Windows电脑设置网络唤醒(Wake-on-LAN)

1. 启用 Windows 电脑的 Wake-on-LAN 功能 首先&#xff0c;你需要确保你的 Windows 电脑支持并启用了 Wake-on-LAN&#xff1a; BIOS/UEFI 设置(具体看自己电脑主板如何设置): 启动 Windows 电脑&#xff0c;进入 BIOS/UEFI 设置。找到网络适配器相关的设置&#xff0c;启用 …...

前端项目构建流程

1. 需求分析 目标&#xff1a;明确项目目标、核心功能和用户需求。 产品需求讨论&#xff1a; 与产品经理、客户、业务部门讨论项目的需求和目标&#xff0c;理解产品的功能、业务流程以及用户需求。定义用户角色&#xff08;Persona&#xff09;&#xff0c;明确不同用户的功…...

支持国密算法的数字证书-国密SSL证书详解

在互联网中&#xff0c;数字证书作为标志通讯各方身份信息的数字认证而存在&#xff0c;常见的数字证书大都采用国际算法&#xff0c;比如RSA算法、ECC算法、SHA2算法等。随着我国加强网络安全技术自主可控的大趋势&#xff0c;也出现了支持国密算法的数字证书-国密SSL证书。那…...

【EndNote使用教程】创建文献库、导入文献、文献分类

1、创建文献库 打开“EndNote”&#xff0c;点击“文件”&#xff0c;点击“新建”&#xff0c;选择保存文件路径。 2、导入文献 &#xff08;1&#xff09;可以选择导入电脑上的PDF文件&#xff0c;如下图所示。 &#xff08;2&#xff09; 也可以选择直接在浏览器网页上面直…...

双十一电容笔选哪个好?!西圣、益博思、吉玛仕电容笔实测对比!

当数码测评博主几年年&#xff0c;我也实测过不下10款电容笔了&#xff0c;对电容笔这个品类也算是半个内行人了。提到电容笔&#xff0c;在平替品牌的追逐中&#xff0c;西圣、益博思、吉玛仕这三款作为国货黑马一直备受瞩目&#xff0c;综合各大电商平台的销量榜、好评口碑榜…...

房地产网络安全:主要风险及缓解建议

房地产行业已开始数字化转型&#xff0c;因此极易受到网络犯罪的攻击。潜在风险的清单很长&#xff1a;从客户敏感信息的数据泄露到勒索软件攻击&#xff0c;网络犯罪分子将房地产公司视为其所携带的所有类型敏感信息的高价值目标。 在本文中&#xff0c;我们将探讨房地产领域…...

玩转大模型的第一步——提示词(Prompt)工程【抛砖篇】

前言 AI大模型提示词工程&#xff0c;又名 LLM prompts Project&#xff0c;指的是在使用大型语言模型&#xff08;如OpenAI的GPT系列&#xff09;时&#xff0c;用于引导模型生成特定响应的输入&#xff0c;是在使用AI大模型过程中非常重要的一个环节&#xff0c;是模型生成文…...

火山引擎数据飞轮线上研讨会即将开启,助力消费品牌双十一造爆款

随着双十一的临近&#xff0c;各大品牌方的备战工作已进入紧张而有序的倒计时阶段。这场持续十多年的电商大促&#xff0c;对消费者来说是购物狂欢节&#xff0c;对各大品牌方来说&#xff0c;则是更是品牌实力与策略的比拼。面对日益激烈的市场竞争&#xff0c;如何更好地撬动…...

【python实战】利用代理ip爬取Alibaba海外版数据

引言 在跨境电商的业务场景中&#xff0c;数据采集是分析市场、了解竞争对手以及优化经营策略的重要环节。然而&#xff0c;随着越来越多企业依赖数据驱动决策&#xff0c;许多跨境电商平台为了保护自身数据&#xff0c;采取了更严格的防护措施。这些平台通过屏蔽大陆IP地址或部…...

FFMPEG录屏(20)--- 枚举macOS下的窗口和屏幕列表,并获取名称缩略图等信息

在 macOS 下获取可屏幕共享的窗口和屏幕 在 macOS 下&#xff0c;我们可以通过使用 Core Graphics 和 Cocoa 框架来获取当前系统中可屏幕共享的窗口和屏幕信息。本文将详细介绍如何获取窗口和屏幕的 ID、标题、坐标、进程图标和缩略图等信息。 前提条件 在开始之前&#xff…...

Redis 命令集 (超级详细)

目录 Redis 常用命令集 string类型 hash类型 list类型 set类型 zset类型 bitmap 类型 geo 类型 GEOADD (添加地理位置的坐标) GEOPOS (获取地理位置的坐标) GEODIST (计算两个位置之间的距离) GEOHASH (返回一个或多个位置对象的 geohash 值) GEORADIUS (根据用户…...

Spring Cloud --- GateWay和Sentinel集成实现服务限流

pom添加依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency><groupId>com.alibaba.csp</groupId><artifactId>s…...

python excel如何转成json,并且如何解决excel转成json时中文汉字乱码的问题

1.解决excel转成json时中文汉字乱码的问题 真的好久没有打开这个博客也好久没有想起来记录一下问题了&#xff0c;今天将表格测试集转成json格式的时候遇到了汉字都变成了乱码的问题&#xff0c;虽然这不是个大问题&#xff0c;但是编码问题挺烦人的&#xff0c;乱码之后像下图…...

【MySQL】实战篇—数据库设计与实现:根据需求设计数据库架构

在设计数据库架构时&#xff0c;开发者需要遵循一系列步骤&#xff0c;以确保数据库能够高效、可靠地满足系统需求。以下是设计数据库架构的理论知识和步骤说明。 1. 需求分析 需求分析是数据库设计的第一步&#xff0c;旨在理解系统的功能需求和数据需求。通过与利益相关者&…...

[Python学习日记-53] Python 中的正则表达式模块 —— re

[Python学习日记-53] Python 中的正则表达式模块 —— re 简介 re 模块 练习 简介 我们在编程的时候经常会遇到想在一段文字当中找出电话号码、身份证号、身高、年龄之类的信息&#xff0c;就像下面的数据一样 # 文件名&#xff1a;美丽学姐联系方式.txt 姓名 地区 …...

Unity编辑器 连接不到SteamVR问题记录

问题表现&#xff1a;之前正常的工程&#xff0c;某天打开后运行&#xff0c;在SteamVR未打开时&#xff0c;Unity工程运行后无法调用起来Steam VR&#xff0c;无任何反应&#xff0c;但用其他软件则可以调用起来SteamVR&#xff0c;并且运行正常&#xff0c;在重装了XR的一些插…...

nginx 日志配置笔记

Nginx 的日志配置非常重要&#xff0c;它可以帮助你记录服务器的访问情况、错误信息等&#xff0c;便于后续的分析和故障排查。Nginx 的日志配置主要包括访问日志&#xff08;access log&#xff09;和错误日志&#xff08;error log&#xff09;。 1、访问日志&#xff08;Ac…...

Java中的接口是什么?如何定义接口?

1、Java中的接口是什么&#xff1f;如何定义接口&#xff1f; 在Java中&#xff0c;接口是一种引用类型&#xff0c;它定义了一组方法的契约&#xff0c;但不包含实现。接口定义了方法签名&#xff0c;但不提供方法的实现细节。Java中的接口用于实现多态性和代码的抽象化。 在…...

​8.13TB高清卫星影像更新(WGS84坐标投影)

最近对WGS84版的高清卫星影像数据进行了一次更新&#xff0c;并基于更新区域生成了相应的接图表。 8.13TB高清卫星影像更新 本次数据更新了14820个离线包&#xff0c;共8.13TB大小&#xff0c;主要更新目标区域为中国东南区域。 更新范围接图表一 更新范围接图表二 更新范围…...

【力扣】[Java版] 刷题笔记-21. 合并两个有序链表

题目&#xff1a; 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题思路 从题目和示例可以看出&#xff0c;应该是要循环遍历链表进行比较&#xff0c;然后组成新的链表。 第一种&#xff1a;递归…...

【Bug】RuntimeError: Engine loop has died

目录 报错前置条件报错内容解决方案 报错前置条件 使用vllm启动qwen2.5-32b-instruct模型后发生的报错 GPU是GeForce RTX 4090 Laptop GPU 系统是Windows 11 运行系统是WSL2-Ubuntu22.04 报错内容 INFO 10-22 22:29:31 engine.py:290] Added request chat-993cbe95e73d4a1db…...

Labview写CIP协议

参考资料 读(INT)变量 发送&#xff1a; 6f00 1C00 6d010f00 00000000 0300000000000000 00000000 00000000 0000 0200 0000 0000 B200 0C00 4d 02 91 02 5353 C300 0100 7856 返回&#xff1a; 6f00 1400 6d010f00 00000000 0300000000000000 00000000 00000000 0000 020…...

Redis批量获取缓存的方法

使用multiGet方法 优点&#xff1a;简单易用&#xff0c;适用于获取少量键的场景。 缺点&#xff1a;当获取的键数量较多时&#xff0c;可能会因为网络延迟导致性能下降。此外&#xff0c;如果某个键不存在&#xff0c;对应的返回值会是null&#xff0c;需要额外处理。 其他…...

MySQL配置文件中server-id的作用是什么

作用一&#xff1a; 通过 server-id 可以用来唯一标识主从复制环境中的一个服务器&#xff0c; 作用二&#xff1a; 再进行主从复制的过程中&#xff0c;会传递二进制日志文件&#xff0c;server-id 帮助MySQL确定哪些日志属于哪个服务器&#xff0c;从而确保日志正确地路由到相…...

Docker入门之构建

Docker构建概述 Docker Build 实现了客户端-服务器架构&#xff0c;其中&#xff1a; 客户端&#xff1a;Buildx 是用于运行和管理构建的客户端和用户界面。服务器&#xff1a;BuildKit 是处理构建执行的服务器或构建器。 当您调用构建时&#xff0c;Buildx 客户端会向 Bui…...

StarRocks数据库在SQL语句中解析JSON字符串

StarRocks数据库在SQL语句中解析JSON字符串 -- 使用数据库 use sr_test; -- 删除表 drop table ts_usr; -- 创建表 CREATE TABLE ts_usr ( uid bigint NOT NULL COMMENT "用户id", uname varchar(64) NULL COMMENT "用户名", ujson varchar(1024) NULL CO…...

RabbitMq-队列交换机绑定关系优化为枚举注册

&#x1f4da;目录 &#x1f4da;简介:&#x1f680;比较&#x1f4a8;通常注册&#x1f308;优化后注册 ✍️代码&#x1f4ab;自动注册的关键代码 &#x1f4da;简介: 该项目介绍&#xff0c;rabbitMq消息中间件&#xff0c;对队列的注册&#xff0c;交换机的注册&#xff0c…...

施磊C++ | 项目实战 | 手写移植SGI STL二级空间配置器内存池 项目源码

手写移植SGI STL二级空间配置器内存池 项目源码 笔者建议配合这两篇博客进行学习 侯捷 | C | 内存管理 | 学习笔记&#xff08;二&#xff09;:第二章节 std::allocator-CSDN博客 施磊C | 项目实战 | SGI STL二级空间配置器源码剖析-CSDN博客 文章目录 手写移植SGI STL二级空…...