STL——list容器

目录

1.list基本概念

2.list构造函数

 3.list赋值和交换

4.list大小操作

5.list插入和删除

 6.list数据存取

7.list反转和排序

8.排序案例


1.list基本概念

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

链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。

链表的组成:链表由一系列结点组成。

结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

STL中的链表是一个双向循环链表

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器。 

list的优点

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

list的缺点

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

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

2.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(list<int>&l)
{for (list<int>::iterator it = l.begin(); it != l.end(); it++){cout << *it << " ";}cout << endl;
}
//list构造函数
void test01()
{//创建list容器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个elemlist<int>l4(10, 1000);printList(l4);
}
int main()
{test01();system("pause");return 0;
}

 3.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(list<int>&l)
{for (list<int>::iterator it = l.begin(); it != l.end(); it++){cout << *it << " ";}cout << endl;
}
//list——赋值和交换
//赋值
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());printList(l3);list<int>l4;l4.assign(10, 1000);printList(l4);
}
//交换
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(10, 1000);cout << "交换前:" << endl;printList(l1);printList(l2);l1.swap(l2);cout << "交换后:" << endl;printList(l1);printList(l2);
}
int main()
{//test01();test02();system("pause");return 0;
}

4.list大小操作

函数原型:

  • size(); ——//返回容器中元素的个数
  • empty();—— //判断容器是否为空
  • resize(num);—— //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
  • resize(num, elem); ——//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
#include<iostream>
using namespace std;
#include<list>
void printList(list<int>&l)
{for (list<int>::iterator it = l.begin(); it != l.end(); it++){cout << *it << " ";}cout << endl;
}
//list容器大小操作
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 << "l1为空。" << endl;}else{cout << "l1不为空。" << endl;cout << "l1中元素的个数为:" << l1.size() << endl;}//重新指定大小l1.resize(10, 132);printList(l1);l1.resize(2);printList(l1);
}
int main()
{test01();system("pause");return 0;
}

5.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(list<int>&l)
{for (list<int>::iterator it = l.begin(); it != l.end(); it++){cout << *it << " ";}cout << endl;
}
//list容器——插入和删除
void test01()
{list<int>l1;//尾插l1.push_back(10);l1.push_back(20);l1.push_back(30);//头插l1.push_front(100);l1.push_front(200);l1.push_front(300);l1.push_front(400);printList(l1);//尾删l1.pop_back();printList(l1);//头删l1.pop_front();printList(l1);//insert——插入list<int>::iterator it = l1.begin();++it;// 300 1000 200 100 10 20 l1.insert(it, 1000);printList(l1);//erase——删除it = l1.begin();l1.erase(it);printList(l1);//remove——移除l1.remove(10);printList(l1);//clear——清空l1.clear();printList(l1);
}
int main()
{test01();system("pause");return 0;
}

 6.list数据存取

函数原型:

  • front();—— //返回第一个元素。
  • back(); ——//返回最后一个元素。
#include<iostream>
using namespace std;
#include<list>
//list容器——数据存取
void test01()
{list<int>l1;l1.push_back(10);l1.push_back(20);l1.push_back(30);l1.push_back(40);cout << "第一个元素为:" << l1.front() << endl;cout << "最后一个元素为:" << l1.back() << endl;//验证迭代器是不支持随机访问的list<int>::iterator it = l1.begin();it++;//支持双向it--;//it = it + 1;//不支持随机访问
}
int main()
{test01();system("pause");return 0;
}

 注:list容器不可以通过[]或者at方式访问数据。

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;
}
//list容器——反转和排序
//反转
void test01()
{list<int>l1;l1.push_back(50);l1.push_back(20);l1.push_back(60);l1.push_back(80);l1.push_back(70);l1.push_back(40);cout << "反转前:";printList(l1);//反转cout << "反转后:";l1.reverse();printList(l1);
}
bool myCompare(int v1, int v2)
{//降序   就让第一个数>第二个数return v1 > v2;
}
//排序
void test02()
{list<int>l1;l1.push_back(50);l1.push_back(20);l1.push_back(60);l1.push_back(80);l1.push_back(70);l1.push_back(40);cout << "排序前:";printList(l1);//sort(l1.begin(), l1.end());//标准算法//所有不支持随机访问的迭代器的容器,不可用标准算法//不支持随机访问迭代器的容器,内部会提供对应的一些算法l1.sort();//默认从小到大——升序cout << "排序后:";printList(l1);l1.sort(myCompare);//降序printList(l1);
}
int main()
{//test01();test02();system("pause");return 0;
}

注:想要实现list容器的降序排序需要用sort(成员函数) 。

8.排序案例

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

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

#include<iostream>
using namespace std;
#include <list>
#include <string>
class Person {
public:Person(string name, int age, int height) {m_Name = name;m_Age = age;m_Height = height;}
public:string m_Name; //姓名int m_Age; //年龄int m_Height; //身高
};
bool ComparePerson(Person& p1, Person& p2) {if (p1.m_Age == p2.m_Age) {return p1.m_Height > p2.m_Height;}else{return p1.m_Age < p2.m_Age;}
}
void test01() {list<Person> L;Person p1("刘备", 35, 175);Person p2("曹操", 45, 180);Person p3("孙权", 40, 170);Person p4("赵云", 25, 190);Person p5("张飞", 35, 160);Person p6("关羽", 35, 200);L.push_back(p1);L.push_back(p2);L.push_back(p3);L.push_back(p4);L.push_back(p5);L.push_back(p6);for (list<Person>::iterator it = L.begin(); it != L.end(); it++) {cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age<< " 身高: " << it->m_Height << endl;}cout << "---------------------------------" << endl;L.sort(ComparePerson); //排序for (list<Person>::iterator it = L.begin(); it != L.end(); it++) {cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age<< " 身高: " << it->m_Height << endl;}
}
int main() {test01();system("pause");return 0;
}

注:

  • 对于自定义数据类型,必须要指定排序规则,否则编译器不知道如何进行排序。
  • 高级排序只是在排序规则上再进行一次逻辑规则制定。

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

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

相关文章

SpringBoot-Shiro

Apache Shiro&#xff1a;https://shiro.apache.org/ 依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.1</version> </dependency>ShiroConfig.java Configuratio…

StringBuilder、StringBuffer

StringBuilder StringBuilder代表可变字符串对象&#xff0c;相当于是一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的。好处&#xff1a;StringBuilder比String更适合做字符串的修该操作&#xff0c;效率会更高&#xff0c;代码也会更简洁…

*-over-slf4j 相关依赖包

*-over-slf4j 是 SLF4J 提供的一系列桥接依赖包&#xff0c;它们用于将其他日志框架的API调用重定向到SLF4J&#xff0c;这样就可以使用统一的SLF4J接口&#xff0c;并通过配置SLF4J的绑定器来选择实际的日志实现。以下是一些常见的 *-over-slf4j 桥接依赖包&#xff1a; jcl-o…

k8s中的namespace及创建方式

1. 什么是namespace&#xff08;名称空间&#xff09; 在 Kubernetes 中&#xff0c;Namespace&#xff08;名称空间&#xff09;是一种用于隔离和组织集群中资源的机制。通俗地说&#xff0c;它就像是在同一个 Kubernetes 集群中划分出来的一些虚拟区域&#xff0c;让你可以在…

Docker Compose容器编排实战

介绍 Docker Compose 是 Docker 官方提供的一种工具&#xff0c;用于定义和运行多个 Docker 容器的应用。它使用简单的 YAML 文件&#xff08;通常称为 docker-compose.yml&#xff09;来配置应用的服务&#xff0c;并使用单个命令即可创建、启动和停止整个应用。 官方文档&am…

计算机网络概述(上)——“计算机网络”

各位CSDN的uu们好呀&#xff0c;好久没有更新小雅兰的计算机网络的专栏啦&#xff0c;而且期末考试也要考计算机网络&#xff0c;所以&#xff0c;小雅兰就来写计算机网络的内容啦&#xff01;&#xff01;&#xff01;下面&#xff0c;让我们进入计算机网络概述的世界吧&#…

rust中的超时处理

rust中的超时处理 自从 tokio 1.0发布以来&#xff0c;rust的异步开发总算大势已定。尽管没达到标准库的速度&#xff0c;依然挡不住大家的热情。看编程排行榜&#xff0c;增加2倍的开发者。 既生瑜何生亮&#xff0c;感觉go就是小号的rust。 不废话了。背景&#xff1a;之前…

为什么要部署堡垒机

现如今网络安全越发受到重视&#xff0c;其中安全审计作为企业信息安全建设不可缺少的组成部分&#xff0c;逐渐受到用户的关注&#xff0c;是企业安全体系中的重要环节。同时&#xff0c;安全审计是事前预防、事中预警的有效风险控制手段&#xff0c;也是事后追溯的可靠证据来…

HarmonyOS引导页登陆页以及tabbar的代码说明 登陆页2

代码&#xff1a;这里的prompt.showToast是弹出提示&#xff0c;Extend(TextInput) 的功能是对TextInput做了公用的样式。isShowProgress是用来控制isShowProgress&#xff0c;出来一个等待效果 import prompt from ‘ohos.promptAction’; import router from ‘ohos.router…

Redis缓存雪崩、缓存击穿、缓存穿透

1. 什么是缓存雪崩 当我们提到缓存系统中的问题&#xff0c;缓存雪崩是一个经常被讨论的话题。缓存雪崩是指在某一时刻发生大量的缓存失效&#xff0c;导致瞬间大量的请求直接打到了数据库&#xff0c;可能会导致数据库瞬间压力过大甚至宕机。尤其在高并发的系统中&#xff0c;…

基于SVM的用气量预测,基于支持向量机SVM的用气量预测

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 完整代码和数据下载链接: 基于SVM的用气量预测,基于支持向量机SVM的用气量预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/8861…

【iptables】增加规则和删除规则

我们在另外一台机器上&#xff0c;使用ping命令&#xff0c;向当前机器发送报文&#xff0c;如下图所示&#xff0c;ping命令可以得到回应&#xff0c;证明ping命令发送的报文已经正常的发送到了防火墙所在的主机&#xff0c;ping命令所在机器IP地址为31.133&#xff08;黑色&a…

前后端分离项目解决跨域问题

基于Vue的前后端分离的项目中解决跨域问题 一、前端反向代理解决跨域 在环境配置文件.env.development/staging/production中配置 请求路径的前缀 VUE_APP_BASE_API /dev-api然后在request.js中封装请求方法中通过baseURL引用公共URL axios.defaults.headers[Content-Type…

如何解决mac无法访问github

确定github能访问的ip地址 点击检测按钮&#xff0c;找到比较快的ip 修改hosts文件&#xff1a;打开终端&#xff0c;输入 open /etc/hosts 后回车&#xff0c;打开mac的文本编辑器 add github.com 140.82.121.4 github.com 199.232.69.194 github.global.ssl.fastly.net …

微服务与人工智能技术的融合

随着人工智能技术的快速发展&#xff0c;越来越多的企业开始关注微服务架构与人工智能技术的结合&#xff0c;以期在市场竞争中获得更大的优势。本文将深入探讨微服务架构与人工智能技术融合的优势、挑战&#xff0c;以及实现这一融合的最佳实践和方法。 首先&#xff0c;让我们…

NCNN环境部署及yolov5pt转ncnn模型转换推理

该内容还未完整&#xff0c;笔记内容&#xff0c;持续补充。 〇开发环境版本 vs2022 cmake3.21.1 ncnn20231027发行版 yolov5s v6.2 vunlkan1.2.198.1 Protobuf3.20.0 Opencv3.4.1 一、模型转换 yolov5s v6.2训练的pt模型&#xff0c;直接导出tourchscript&#xff0c…

ubuntu 开机自报IP地址(用于无屏幕小车-远程连接)

目录 1.环境安装2.代码3.打包成可执行文件4.开启开机自启 1.环境安装 sudo apt-get install espeak #先安装这个库 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyttsx32.90 #再安装pyttsx3 pyinstaller pip install -i https://pypi.tuna.tsinghua.edu.cn/si…

C语言实例_生成6位数的随机密码

一、前言 随着数字化时代的到来&#xff0c;人们在各个方面需要使用密码来保护个人隐私和敏感信息的安全。为了确保密码的安全性&#xff0c;密码应该是足够强大和难以猜测的&#xff0c;这就需要密码生成器来帮助用户生成高强度的随机密码。 随机密码生成器是一种计算机程序…

P1019 [NOIP2000 提高组] 单词接龙 刷题笔记

P1019 [NOIP2000 提高组] 单词接龙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路来自 大佬 Chardo 的个人中心 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 匹配 &#xff1a; 将 第一个字符串末尾 和第二个字符串第一个开始匹配 如果 j<i这段走完了 flag还没…

ubuntu 用户管理

ubuntu 用户管理 用户组管理用户管理VNC 远程桌面参考 用户组管理 # 查看所有组信息 cat /etc/group # 查看当前用户所在组 groups # 添加用户组 sudo groupadd uav# 添加ostest用户到 uav 用户组 需要注销并重新登录 sudo gpasswd -a ostest uav sudo usermod -aG uav ostes…