C++ 106 之 list容器

news2024/11/26 17:52:40
#include <iostream>
#include <string>
using namespace std;
// #include <vector>   // 容器头文件
#include <algorithm> // 标准算法头文件
#include <list>

void printList(const list<int> & list1){
    for(list<int>::const_iterator it = list1.begin(); it != list1.end(); it++){
        cout << *it << " ";
    }
    cout << endl;
}

class Student04{
public:
    string m_name;
    int m_age;
    int m_height;
    Student04(string name, int age, int height){
        this->m_name = name;
        this->m_age = age;
        this->m_height = height;
    }
    // const 不想让它被修改
    bool operator==(const Student04& stu) const{ // const修饰的函数,叫常函数


        // return this->m_age == stu.m_age && this->m_name == stu.m_name && this->m_height == stu.m_height; 
        return this->m_age == stu.m_age && this->m_name == stu.m_name && this->m_height == stu.m_height;


    }
};

bool com_age(Student04 &stu1, Student04 &stu2){
    // return stu1.m_age > stu2.m_age; // 降序排列
    // return stu1.m_age < stu2.m_age; // 升序排列

    // 若果年龄形同,按照身高升序排列
    if(stu1.m_age == stu2.m_age)
    {
        return stu1.m_height < stu2.m_height;
    }
    else{
        return stu1.m_age < stu2.m_age;
    }
}

int main()
{
    // 双向循环连表list

    list<int> list1;
    list1.push_back(1);
    list1.push_back(2);
    list1.push_back(3);

    list1.push_front(10);
    list1.push_front(20);
    list1.push_front(30);
    // 正序遍历
    // for(list<int>::iterator it = list1.begin(); it != list1.end(); it++)
    // {
    //     cout << *it << endl;
    // }

    // 倒序遍历
    // reverse_iterator 倒序迭代器
    // rbegin()   read()  右侧的开始和结束位置
    // for(list<int>::reverse_iterator it = list1.rbegin(); it != list1.rend(); it++)
    // {
    //     cout << *it << endl;
    // }

    // list迭代器  
    // list<int>::iterator it_begin = list1.begin();
    //it_begin++;
    // it_begin--;

    // list迭代器不支持随即访问的,下面语法报错,不允许
    // it_begin = it_begin + 3;

    // cout << *it_begin << endl;

    // printList(list1);
    // list1.pop_back();   // 尾删
    // list1.pop_front();  // 头删
    // printList(list1);

    // list1.insert(list1.begin(), 777);

    // list<int>::iterator it_begin = list1.begin();
    // advance(it_begin, 2);    // 向后移动2个位置
    // advance(it_begin, -1);      // 向前移动1个位置
    // list1.insert(it_begin, 777);
    // printList(list1);


    // // erase 根据迭代器位置进行删除
    // printList(list1);
    // // list1.erase(list1.begin());
    // list<int>::iterator it_begin = list1.begin();
    // advance(it_begin, 2);
    // advance(it_begin, -1);
    // list1.erase(it_begin);
    // printList(list1);

    // remove 删除容器中所有匹配的元素
    // list1.push_back(1);
    // list1.push_back(1);
    // list1.push_back(1);
    // printList(list1);
    // list1.remove(1);
    // printList(list1);

    // 交换
    // list<int> list2;
    // list2.assign(10, 666);
    // list1.swap(list2);
    // printList(list1);

    //反转
    // printList(list1);
    // list1.reverse();
    // printList(list1);

    // // 排序
    // printList(list1);
    // // list1.sort(); // 升序排列
    // // 想实现降序,需要先升序、再反转
    // list1.sort();
    // list1.reverse();
    // printList(list1);

    // 案例:
    Student04 stu1("赵云",62, 190);
    Student04 stu2("关羽",62, 210);
    Student04 stu3("张飞",62, 205);
    Student04 stu4("曹操",9, 179);

    list<Student04> list_stu;

    list_stu.push_back(stu1);
    list_stu.push_back(stu2);
    list_stu.push_back(stu3);
    list_stu.push_back(stu4);

    for(list<Student04>::iterator it = list_stu.begin(); it != list_stu.end(); it++){
        cout << "姓名: " << (*it).m_name << "  年龄:" << it->m_age << " 身高:"<< it->m_height <<endl; 
    }

    cout << "-----------------------------" << endl;

    list_stu.sort(com_age); // 自定义类型在list中想要升序或降序排列,学要传回调函数



    for(list<Student04>::iterator it = list_stu.begin(); it != list_stu.end(); it++){
        cout << "姓名: " << (*it).m_name << "  年龄:" << it->m_age << " 身高:"<< it->m_height <<endl; 
    }

    cout << "-----------------------------" << endl;

    list_stu.remove(stu3);
    for(list<Student04>::iterator it = list_stu.begin(); it != list_stu.end(); it++){
        cout << "姓名: " << (*it).m_name << "  年龄:" << it->m_age << " 身高:"<< it->m_height <<endl; 
    }

    return 0;
}

 

list容器

3.6.1 list容器基本概念

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

相较于vector的连续线性空间,list就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移除,list永远是常数时间。

List和vector是两个最常被使用的容器。

List容器是一个双向循环链表。

​​​​​​​

  • 采用动态存储分配,不会造成内存浪费和溢出

  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

  • 链表灵活,但是空间和时间额外耗费较大

3.6.2 list容器的迭代器

List容器不能像vector一样以普通指针作为迭代器,因为其节点不能保证在同一块连续的内存空间上。List迭代器必须有能力指向list的节点,并有能力进行正确的递增、递减、取值、成员存取操作。所谓”list正确的递增,递减、取值、成员取用”是指,递增时指向下一个节点,递减时指向上一个节点,取值时取的是节点的数据值,成员取用时取的是节点的成员。

由于list是一个双向链表,迭代器必须能够具备前移、后移的能力,所以list容器提供的是Bidirectional Iterators.

List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效。这在vector是不成立的,因为vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效,甚至List元素的删除,也只有被删除的那个元素的迭代器失效,其他迭代器不受任何影响。

3.6.3 list容器的数据结构

list容器不仅是一个双向链表,而且还是一个循环的双向链表。

3.6.4 list常用API

3.6.4.1 list构造函数

list<T> lstT;//list采用采用模板类实现,对象的默认构造形式:

list(beg,end);//构造函数将[beg, end)区间中的元素拷贝给本身。

list(n,elem);//构造函数将n个elem拷贝给本身。

list(const list &lst);//拷贝构造函数。

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

3.6.4.3 list大小操作

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

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

resize(num);//重新指定容器的长度为num,

若容器变长,则以默认值填充新位置。

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

resize(num, elem);//重新指定容器的长度为num,

若容器变长,则以elem值填充新位置。

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

3.6.4.4 list赋值操作

assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。

assign(n, elem);//将n个elem拷贝赋值给本身。

list& operator=(const list &lst);//重载等号操作符

swap(lst);//将lst与本身的元素互换。

3.6.4.5 list数据的存取

front();//返回第一个元素。

back();//返回最后一个元素。

3.6.4.6 list反转排序

list1.reverse();//反转链表,比如lst包含1,3,5元素,运行此方法后,lst就包含5,3,1元素。

list1.sort(); //list排序 需要导入 algorithm 头文件

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

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

相关文章

半小时速通Python爬虫!GitHub开源的Python爬虫入门教程

今天给小伙伴们带来了一篇详细介绍 Python 爬虫入门的教程&#xff0c;从实战出发&#xff0c;适合初学者。 小伙伴们只需在阅读过程紧跟文章思路&#xff0c;理清相应的实现代码&#xff0c;30 分钟即可学会编写简单的 Python 爬虫。 这篇 Python 爬虫教程主要讲解以下 5 部…

flutter开发实战-ListWheelScrollView与自定义TimePicker时间选择器

flutter开发实战-ListWheelScrollView与自定义TimePicker 最近在使用时间选择器的时候&#xff0c;需要自定义一个TimePicker效果&#xff0c;当然这里就使用了ListWheelScrollView。ListWheelScrollView与ListView类似&#xff0c;但ListWheelScrollView渲染效果类似滚筒效果…

招聘,短信与您:招聘人员完整指南

招聘人员面临的最大挑战之一就是沟通和联系候选人。为何?我们可以从以下原因开始&#xff1a;候选人通常被太多的招聘人员包围&#xff0c;试图联系他们&#xff0c;这使得你很难吸引他们的注意。在招聘过程的不同阶段&#xff0c;根据不同的工作量&#xff0c;让申请人保持最…

墨刀原型-单选按钮场景交互

画原型过程中&#xff0c;会遇到单选或多选的交互场景 这时就可以直接在基础组件部分&#xff0c;拉取单选按钮直接使用&#xff0c;只需要完成对应的交互事件就可实现交互 首先先说单选按钮实现交互 拉取一个单选组件&#xff0c;右侧可调整样式尺寸&#xff0c;在选项部分&…

OpenGL3.3_C++_Windows(23)

伽ga马校正 物理亮度 光子数量 线性空间&#xff1a;光子数(亮度&#xff09;和颜色值的线性关系人眼感知的亮度&#xff1a;对比较暗的颜色变化更敏感&#xff0c;感知亮度基于人的感觉非线性空间&#xff1a;光子数(亮度&#xff09;和 颜色值^2.2&#xff0c;恰好符合屏幕…

Navicat数据库软件免费了!推出Navicat Premium Lite

2024年6月26日&#xff0c;数据库管理工具领域的知名品牌Navicat&#xff0c;推出其免费版本——Navicat Premium Lite&#xff0c;用户可从Navicat官网下载体验这款软件。 这款针对入门级用户的数据库管理开发工具&#xff0c;支持基础的数据库管理和协同合作功能&#xff0c…

仓颉开发入门初体验

作者&#xff1a;黄林晴 顺便吆喝一声&#xff0c;如果你计算机、软件工程、电子等相关专业本科及以上学历&#xff0c;欢迎来共事。前端/后端/测试均可投&#xff0c;技术大厂。 前言 在刚刚召开的华为开发者大会&#xff08;HDC 2024&#xff09;上&#xff0c;华为内部研…

观测到“量子反常霍尔效应”,为何就被称为“离诺奖最近的物理学家”?

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;2000字丨8分钟阅读 6 月 24 日&#xff0c;2023 年度国家最高科学技术奖在京揭晓&#xff0c;61岁的凝聚态物理领域科学家、清华大学薛其坤院士荣…

基于改进天鹰优化算法(IAO)优化BP神经网络数据分类预测(IAO-BP)

改进天鹰优化算法(IAO)见&#xff1a;【智能优化算法】改进的AO算法(IAO)-CSDN博客 BP神经网络的数据分类预测&#xff1a;基于BP神经网络的数据分类预测-CSDN博客 代码原理 基于改进天鹰优化算法&#xff08;IAO&#xff09;优化BP神经网络数据分类预测&#xff08;IAO-BP&…

win系统缺少vcruntime140.dll文件的解决办法,亲测实用的解决方法

运行软件的时候提示无法启动此程序&#xff0c;因为计算机中丢失 vcruntime140.dll 尝试重新安装该程序以解决此问题&#xff0c;其实主要因为vcruntime140.dll丢失&#xff0c;如果您启动程序并收到 Windows 无法找到 vcruntime140.dll DLL 或它丢失的错误&#xff0c;您可以使…

# Kafka_深入探秘者(10):kafka 监控

Kafka_深入探秘者&#xff08;10&#xff09;&#xff1a;kafka 监控 一、kafka JMX 1、JMX &#xff1a;全称 Java Managent Extension 在实现 Kafka 监控系统的过程中&#xff0c;首先我们要知道监控的数据从哪来&#xff0c;Kafka 自身提供的监控指标(包括 broker 和主题的…

如何进行员工 OKR 反馈?

目标和关键结果框架是一种协作性的目标设定方法&#xff0c;帮助团队设定理想的目标&#xff08;目标&#xff09;&#xff0c;并有具体的、可衡量的行动项目&#xff0c;称为关键结果。实施 OKR 为一个富有成效的、以目标为导向的环境奠定了基础&#xff0c;从而消除了提供反馈…

报名通道开启!2024国际燃气轮机运维大会将于10月登陆花城

驱动未来运维技术革新 共筑燃机生态新纪元 | 2024国际燃气轮机运维大会报名通道正式开启 随着全球燃气轮机装备技术不断升级与“双碳”战略的深入&#xff0c;全球燃气轮机市场规模也将进一步扩大&#xff0c;预计到2033年达到536.7亿美元左右&#xff0c;2023-2033年预测期间年…

关于FPGA对 DDR4 (MT40A256M16)的读写控制 4

关于FPGA对 DDR4 &#xff08;MT40A256M16&#xff09;的读写控制 4 语言 &#xff1a;Verilg HDL 、VHDL EDA工具&#xff1a;ISE、Vivado、Quartus II 关于FPGA对 DDR4 &#xff08;MT40A256M16&#xff09;的读写控制 4一、引言二、DDR4 SDRAM设备中模式寄存器重要的模式寄存…

普元MDM主数据管理系统与金蝶云星空ERP系统(企业版)集成方案(工程机械行业)

一、客户介绍 某工程机械行业龙头公司业务范围包括工程机械、矿山机械、农业机械、环卫机械、应急救援装备和商用汽车、现代服务业等&#xff0c;产品远销190多个国家和地区&#xff0c;覆盖“一带一路”沿线95%以上的国家和地区&#xff0c;年出口总额和海外收入持续居中国行…

10种超强图像特征提取算法Python代码实现

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类算法的家人&#xff0c;可关注我的VX公众号&#xff1a;python算法小当家&#xff0c;不定期会有很多免费代码分享~ 图像特征提取是计算机视觉和图像处理的关键步骤&#xff0c;因…

中国航天:星舰与猛禽发动机数据分析

文章目录 MainReference Main 马斯克坚信&#xff0c;随着星舰的全面投入运营&#xff0c;SpaceX将能够承担地球上主轨道超过99%的载荷质量。这款第三代星舰的起飞推力将跃升至10000吨以上&#xff0c;其有效载荷质量亦将高达200吨以上。 不仅如此&#xff0c;每次发射的成本控…

文华财经盘立方同花顺期货通均线多空变色指标公式源码

文华财经盘立方同花顺期货通均线多空变色指标公式源码&#xff1a; VAR1:(HHV(HIGH,21)-C)/(HHV(HIGH,21)-LLV(LOW,21))*100-10; VAR2:(C-LLV(LOW,21))/(HHV(HIGH,21)-LLV(LOW,21))*100; VAR3:SMA(VAR2,13,8); 多方: SMA(VAR3,13,8),LINETHICK2; A:MA(-100*(HHV(HIGH,34)-…

又是一篇关于GD32堆栈的梳理+FreeRTOS的空间

GD32F103CB&#xff1a;SRAM 20K&#xff08;0x5000&#xff09; 这篇文章主要想讲清楚几个事情&#xff1a; 1、启动文件Stack_Size、Heap_Size的大小设置有啥影响&#xff1b; 2、FreeRTOS的内存&#xff1a;FreeRTOSConfig.h文件configTOTAL_HEAP_SIZE&#xff1b; 问题2…

Linux[高级管理]——Squid代理服务器的部署和应用(传统模式详解)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月24日11点11分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— Squid功能 Squ…