List

news2024/11/15 21:08:41

1.基本概念

功能:

将数据进行链式存储


链表(list)  是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
链表的组成:  链表由一系列结点组成
结点的组成: 一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
STL中的链表是一个双向循环链表

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器
list的优点:
·采用动态存储分配,不会造成内存浪费和溢出
·链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

list的缺点:
链表灵活,但是空间(指针域)和时间(遍历)额外耗费较大
List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。

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

2.list的构造函数

函数原型:

list<T> lst;                //List采用采用模板类实现.对象的默认构造形式:
list(beg, end);            //构造函教将[beg end)区间中的元素拷贝给本身。
list(n , elem);               //构造函数将n个elem拷贝给本身。
list(const list &lst);             //拷贝构造函数。
//打印
void PrintList(const list<int> &lis) 
{
    for (list<int>::const_iterator it = lis.begin(); it != lis.end(); it++) {
        cout << *it << "  ";
    }
    cout << endl;
}
void test300() {
    list<int> l1;
    //添加数据
    l1.push_back(23);
    l1.push_back(43);
    l1.push_back(63);
    l1.push_back(83);
    //打印
    PrintList(l1);
    //区间构造
    list<int> l2(l1.begin(), l1.end());
    PrintList(l2);
    //拷贝构造
    list<int>l3(l2);
    PrintList(l3);
    //n个elem
    list<int> l4(10, 99);
    PrintList(l4);
}

3. list赋值和交换功能

描述:
给list容器进行赋值,以及交换list容器
函数原型:
assign(beg, end);        //将[beg, end]区间中的数据拷贝赋值给本身。
assign(n,elem);            //将n个elem拷贝赋值给本身。
list& operator=(const list &lst);    //重载等号操作符
swap(lst);                       //将lst与本身的元素互换。

//交换 l1与l4的数据
    l1.swap(l4);

4. list大小操作


函数原型:
size();            //返回容器中元素的个数
empty();         //判断容器是否为空
resize( num);  //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

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

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

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值匹配的元素。

6.list 数据存取

函数原型:
front();          //返回第一个元素。
back();         //返回最后一个元素。

list本质链表,不是用连续线性空间存储数据,迭代器也是不支持随机访问的

不可以用 [ ] 访问list容器中的元素

不可以用  at  方式访问list容器中的元素

 7.list容器排序和反转

函数原型:
reverse();           //反转链表

    l2.reverse();
sort():                //链表排序

bool myCompare(int v1, int v2)
{
    //降序
    return v1 > v2;
}

//所有不支持随机访问迭代器的容器,不可以用标准算法
        //不支持随机访问迭代器的容器,内部会提供对应一些算法
        //默认排序规则  从小到大升序
        l2.sort();
        PrintList(l2);
        //降序
        l2.sort(myCompare);
        PrintList(l2);

8.自定义排序

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

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

需求:

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

class Person
{
public:
    string m_Name;
    int m_Age;
    int m_Height;

    Person(string name, int age, int height)
    {
        this->m_Age = age;
        this->m_Height = height;
        this->m_Name = name;
    }

};

//指定排序规则
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 test0265() 
{
    //创建容器
    list<Person> L;

    //准备数据
    Person p1("hey", 25, 175);
    Person p2("kiring", 35, 195);
    Person p3("iron man", 45, 180);
    Person p4("spide man", 25, 168);
    //插入数据
    L.push_back(p1);
    L.push_back(p2);
    L.push_back(p3);
    L.push_back(p4);

    //打印
    cout << "排序前" << endl;
    for (list<Person>::iterator it = L.begin(); it != L.end(); it++) {
        cout << " 姓名:" << (*it).m_Name << " 身高:" << (*it).m_Height << " 年龄:" << (*it).m_Age << endl;

    }
    cout << "排序后" << endl;

    L.sort(ComparePerson);
    for (list<Person>::iterator it = L.begin(); it != L.end(); it++) {
        cout << " 姓名:" << (*it).m_Name << " 身高:" << (*it).m_Height << " 年龄:" << (*it).m_Age << endl;

    }
}

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

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

相关文章

18.生命周期

目录 1 开启生命周期 2 创建前 beforeCreate() 3 创建后 created() 4 渲染前 beforeMount() 5 渲染后 mounted 6 更新渲染前 beforeUpdate() 7 更新渲染后 updated() 8 移除前 beforeUnmount() 9 移除后 unmounted() 生命周期是指 一个组件从创建->运行-&…

linux安装和使用jekins

Jenkins详细安装配置部署--超详细_jenkins安装部署_宝贝富贵猪的博客-CSDN博客 1.安装JDK 2.获取安装包 下载页面&#xff1a;https://jenkins.io/zh/download/ 或者Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 3.安装Jenkins sud…

深入理解Android布局:ConstraintLayout和RecyclerView的使用

深入理解Android布局&#xff1a;ConstraintLayout和RecyclerView的使用 I. 引言 介绍Android中布局的重要性 提出使用ConstraintLayout和RecyclerView布局的目的和意义 II. ConstraintLayout的使用 介绍ConstraintLayout的基本概念和特点 详细介绍ConstraintLayout的各种属性…

Spring Cloud微服务架构组件【Java培训】

SpringCloud是一系列框架的有序集合&#xff0c;为开发人员构建微服务架构提供了完整的解决方案。Spring Cloud根据分布式服务协调治理的需求成立了许多子项目&#xff0c;每个项目通过特定的组件去实现&#xff0c;下面我们讲解一下Spring Cloud 包含的常用组件以及模块。 (1…

【工业智能】需要了解的知识

【工业智能】需要了解的知识 算法数据预测模型决策协同模型优化控制异常诊断 图像目标检测语义分割关键点检测图像匹配3D抓取度量学习异常检测6D姿态估计 工业自动化、物联网通信IOT工业自动化边缘计算 写在前面&#xff1a; 本文仅为自己记录&#xff0c;不具有指导意义。 算法…

软文推广:真实有效提升软文排名与收录的三大方法!

软文是一种具有良好传播效果的文体&#xff0c;可以通过在搜索引擎中排名靠前的方式&#xff0c;为品牌或企业带来更多曝光。但是&#xff0c;如何让软文在搜索引擎中得到更好的收录和排名呢&#xff1f;在本文中&#xff0c;我们将讨论如何提升软文的收录和排名&#xff0c;以…

【DNS域名解析服务】

目录 一、DNS系统的作用DNS的介绍1.1、通用的顶级域名 二、DNS域名解析&#xff08;面试题&#xff09;三、DNS查询方式递归查询迭代查询 四、构建DNS域名服务器步骤4.1、安装bind软件包4.2、修改配置文件4.3、域名的配置修改区域配置文件&#xff0c;添加正向区域配置 4.4、覆…

Canokey Pigeon的初级玩法

Canokey Pigeon的初级玩法 前言开箱使用控制台新版旧版 初步设置FIDO2 PIN更改重置 坑&#xff08;或者说不满意的地方&#xff09;玩法FIDO2/U2FOpenPGPPIVNDEFOATH 参考 本文转载于我的博客Canokey Pigeon的初级玩法 Canokey Pigeon今天终于到货了 {% note warning flat %} …

【C++缺省参数、函数重载详解】

目录 一、缺省参数1.1缺省参数的定义1.2缺省参数的分类1.3缺省参数使用时的注意事项 二、函数重载2.1函数重载的概念2.2为什么要有函数重载2.3 C支持函数重载的原理 一、缺省参数 1.1缺省参数的定义 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&a…

搭建B2B2C多用户国际版商城系统,快速为外贸企业开拓新市场

企业市场竞争激烈&#xff0c;不只体现在国内&#xff0c;甚至全球&#xff0c;电商行业发展迅速&#xff0c;各企业各行业甚至进出口都竞争相当激烈。要想在这种告诉竞争中脱颖而出&#xff0c;开拓新市场&#xff0c;带来新盈利与新契机是必不可少的。易族智汇Javashop助力企…

nmap学习笔记

一、环境准备 Windows10主机Kali虚拟机&#xff08;使用nmap的地方&#xff09;metasploitable虚拟机为以上三个操作系统配置静态IP。 Windows主机的IP&#xff1a;192.168.80.3Kali的IP&#xff1a;192.168.80.2metasploitable的IP&#xff1a;192.168.80.4 具体配置方法请参…

STM32-窗口看门狗WWDG实验

窗口看门狗本质上是一个能产生系统复位信号和提前唤醒中断的定时器。它通常被用来监测&#xff0c;由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新&#xff0c;否则看门狗电路在达到预置的时间周期时…

代码随想录二刷-队列及其应用题目(JS)【重要】

239.滑动窗口最大值 题目 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶&#xff1a; 你能在线性时间复杂度内解决此题吗…

Thinkpad-t470电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Thinkpad-t470 处理器Intel Core i7-6600U 2.6GHz / 3.4Ghz Turbo已驱动 内存16GB DDR4 2666Mhz (SK Hynix)已驱动 硬盘Intel SSD Pro 7600P 51…

与Linux的文件权限有关的知识

在Linux系统中&#xff0c;每个文件都有一个所有者和一个用户组。此外&#xff0c;系统还定义了一个“其他人”分类。 文件的所有者通常是创建该文件的用户&#xff0c;而用户组则是在创建该文件时指定的。如果没有指定&#xff0c;则默认为创建用户的主用户组。用户组可以在文…

核心业务1:账户绑定业务

核心业务1:账户绑定业务 1.业务流程图 2.账户绑定数据库设计 3.账户绑定业务流程 4.代码逻辑 5.代码逻辑细节 核心业务1:账户绑定业务 1.业务流程图 ①用户绑定数据到商户平台(已

C++map/set与unordered系列的区别

文章目录 map/set与unordered系列的区别map/set与unordered系列的性能对比测试总结 map/set与unordered系列的区别 1: map/set遍历时是有序的,unordered_map/unordered_set遍历时是无序的. 以set和unordered_set容器为例: 2: map/set是双向迭代器,底层数据结构为红黑树,unor…

重磅 | Shifu物联网开发框架成为CNCF认证项目

近日&#xff0c;边无际Shifu项目被收录进CNCF云原生全景图&#xff0c;成为了云原生计算基金会认证的项目之一。此次收录证明了Shifu具备了符合CNCF标准的技术能力和良好的社区发展&#xff0c;展现了Shifu在云原生计算领域的实力和可信度&#xff0c;巩固了Shifu在云原生领域…

J2EE,Java EE,Jakarta EE 命名之间的恩恩怨怨

介绍 简单来说&#xff0c;上面所有的名字指的都是一个东西 Java Platform, Enterprise Edition 上面的几个名词都是下面的内容的简写&#xff1a; J2EE(Java 2 Platform, Enterprise Edition)Java EE (Java Platform, Enterprise Edition)Jakarta EE(Jakarta Enterprise Edi…

learn_C_deep_1 (C程序补充知识、变量的声明和定义、声明和定义的区别)

目录 C程序补充知识 变量的声明和定义 1.什么是变量&#xff1f; 2.变量的本质是什么&#xff1f; - 所有的变量都要在内存的某个位置开辟空间 3.变量的定义和声明形式、初始化和赋值的区别 4.为什么要定义变量 声明和定义的区别 C程序补充知识 先让我们来看一段C语言…