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,一经查实,立即删除!

相关文章

StringBuilder、StringBuffer

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

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

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

rust中的超时处理

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

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;…

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

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

如何解决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还没…

ffmpeg两种windows版本区别说明

版本一 必须拷贝exe和dll文件才能使用&#xff0c;如果缺少dll则exe不正正常执行 如果缺少dll &#xff0c;执行 exe会报错如下 版本2 直接拷贝exe就能使用&#xff0c;没有依赖的环境

Power BI - 5分钟学习合并文件

每天5分钟&#xff0c;今天介绍Power BI合并文件 什么是合并文件&#xff1f; 合并文件就是将具有相同架构的多个文件合并到单个逻辑表中。 如果要合并同一文件夹中的所有文件时&#xff0c;此功能非常有用。 例如&#xff0c;如果你有一个文件夹&#xff0c;其中包含公司的所…

极智嘉加快出海发展步伐,可靠产品方案获客户认可

2023年&#xff0c;国内本土企业加快出海征程&#xff0c;不少企业在出海发展中表现出了优越的集团实力与创新的产品优势&#xff0c;有力彰显了我国先进的科技研发实力。作为全球仓储机器人引领者&#xff0c;极智嘉&#xff08;Geek&#xff09;也在不断加快出海发展步伐&…

已囤积189150枚BTC,微策略的策略会暴雷吗?

号外&#xff1a;教链内参12.27《美元快速下行&#xff0c;黄金再创新高》 日前&#xff0c;微策略&#xff08;Microstrategy&#xff09;创始人Michael Saylor发推称&#xff0c;微策略再次出手&#xff0c;以均价约42110刀再次加仓14620枚BTC。截至2023.12.26&#xff0c;微…

**Python**综合案例

Python综合案例 一、系统需求分析 1、需求分析 使用面向对象编程思想完成学员管理系统的开发,具体如下: ① 系统要求:学员数据存储在文件中 ② 系统功能:添加学员、删除学员、修改学员信息、查询学员信息、显示所有学员信息、保存学员信息及退出系统等功能。 2、角色…

超时控制:Go语言下的网络请求与时间赛跑

开场白&#xff1a;在互联网的世界里&#xff0c;我们经常要与各种API打交道。有时&#xff0c;这些API可能会因为各种原因而变得“慢条斯理”&#xff0c;这时&#xff0c;超时控制就显得尤为重要了。今天&#xff0c;我们就来聊聊如何在Go语言中实现HTTP请求的超时控制&#…

python读取eps矢量图片

再利用Image读取时&#xff0c;提示报错&#xff1a; OSError: Unable to locate Ghostscript on paths 解决办法&#xff1a; 首先要安裝ghostscript软件&#xff1a;Ghostscript : Downloads 安装后记住安装路径&#xff0c;并找到bin的文件夹 之后在使用时&#xff0c;在代…

java freemarker 动态生成excel文件

好久木有更新啦 抓住2023的小尾巴 浅浅更新一下吧~ 最近做了一个动态生成excel的功能&#xff0c;这里记录下部分功能&#xff0c;主要用到的是freemarker框架&#xff0c;spring就有带&#xff0c;我起的demo载入了一下freemarker的jar包 一、创建模板 首先可以创建一个e…