C++ 106 之 list容器

#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 头文件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

牛客小白月赛97:D走一个大整数迷宫

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 给一个 nmn\times mnm 矩阵迷宫&#xff0c; 第 iii 行第 jjj 列的值为 ci,jc_{i,j}ci,j​ &#xff0c;LHLHLH 在迷宫中迷路了&#xff0c;他需要你的帮助。 LHLHLH 当前在 (1,1)(1…

Python28-2 机器学习算法之SVM(支持向量机)

SVM&#xff08;支持向量机&#xff09; 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种用于分类和回归分析的监督学习模型&#xff0c;在机器学习领域中被广泛应用。SVM的目标是找到一个最佳的分割超平面&#xff0c;将不同类别的数据分开&…

笔记本重装系统怎么操作? windows电脑重装系统,超实用的四种方法

重新安装操作系统是维护计算机性能和确保系统稳定运行的重要步骤。对于 Windows 笔记本用户而言&#xff0c;熟悉重装系统的方法可以帮助他们解决各种问题&#xff0c;从提高系统速度到修复软件故障。然而具体来讲&#xff0c;笔记本重装系统怎么操作呢&#xff1f;接下来&…

基于SpringBoot和PostGIS的某国基地可视化实战

目录 前言 一、Java后台开发设计与实现 1、模型层实现 2、控制层设计 二、WebGIS界面实现 1、列表界面的定义 2、全球基地可视化 三、成果展示 1、全球部署情况 2、亚太地区 3、欧洲基地分布 4、中东的部署 四、总结 前言 在之前的博客中&#xff0c;我们曾经对漂亮…

我在高职教STM32——GPIO入门之按键输入(2)

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…

影响LED显示屏质量的关键因素

LED电子显示屏以其环保节能的特点&#xff0c;成为现代显示技术的重要选择。然而&#xff0c;确保显示屏的质量和安全使用&#xff0c;需要考虑多个方面。本文将探讨影响LED电子显示屏质量的关键因素&#xff0c;以及在不同环境下如何预防失火现象。 材质因素 显示屏的质量首先…

排序(冒泡排序、选择排序、插入排序、希尔排序)-->深度剖析(一)

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 排序是一种基本的数据处理操作&#xff0c;它涉及将一系列项目重新排列&#xff0c;以便按照指定的标准&#xff08;通常是数值大小&#xff09;进行排序。在C语言中&#xff0c;排序算法是用来对元素进行排序的一系…

C语言从入门到进阶(15万字总结)

前言&#xff1a; 《C语言从入门到进阶》这本书可是作者呕心沥血之作&#xff0c;建议零售价1元&#xff0c;当然这里开个玩笑。 本篇博客可是作者之前写的所有C语言笔记博客的集结&#xff0c;本篇博客不止有知识点&#xff0c;还有一部分代码练习。 有人可能会问&#xff…

“ONLYOFFICE 8.1:提升用户体验和编辑功能的全面升级”

引言 官网链接 在当今快节奏的工作环境中&#xff0c;高效地处理文档是每个职场人士必备的技能。ONLYOFFICE 桌面编辑器凭借其强大的功能和用户友好的界面&#xff0c;成为了提升文档处理效率的得力助手。本文将介绍 ONLYOFFICE 桌面编辑器的核心特性&#xff0c;并展示如何通…

PAI3D: Painting Adaptive Instance-Prior for 3D Object Detection论文讲解

PAI3D: Painting Adaptive Instance-Prior for 3D Object Detection论文讲解 1. 引言2. PAI3D框架2.1 Instance Painter2.2 Adaptive Projection Refiner2.3 Fine-granular Detection Head 3. 实验结果3.1 消融实验 1. 引言 3D目标检测对于自动驾驶来说是一个非常重要的模块&a…

鸿蒙系统——强大的分布式系统

鸿蒙相比较于传统安卓最最最主要的优势是微内核分布式操作系统&#xff0c;具有面向未来&#xff0c;跨设备无缝协作&#xff0c;数据共享的全场景体验。下面简单来感受一下鸿蒙系统的多端自由流转。 自由流转概述 场景介绍 随着全场景多设备的生活方式不断深入&#xff0c;…

background 与 background-image

相同点&#xff1a;background 与 background-image都可以用于设置背景图 区别. background既可以用于设置背景图&#xff0c; 又可以用于设置CSS样式&#xff0c;还可以用于设置背景属性。 background-image只能用于设置背景图 background能设置的背景属性&#xff0c;如下&…

学习过程中遇到的 部分问题及解决办法

1.安装build wheel时报错&#xff1a; The detected CUDA version (12.1) mismatches the version that was used to compile PyTorch (11.7). Please make sure to use the same CUDA versions. 由于cuda版本和 当前虚拟环境中的pytorch-cudatoolkit版本不同&#xff0c; 解…

数据结构历年考研真题对应知识点(数组和特殊矩阵)

目录 3.4数组和特殊矩阵 3.4.2数组的存储结构 【二维数组按行优先存储的下标对应关系(2021)】 3.4.3特殊矩阵的压缩存储 【对称矩阵压缩存储的下标对应关系(2018、2020)】 【上三角矩阵采用行优先存储的应用(2011)】 【三对角矩阵压缩存储的下标对应关系(2016)】 3.4.…

【AIGC】《AI-Generated Content (AIGC): A Survey》

文章目录 相关概念What is AI-generated content?Necessary conditions of AIGCHow can AI make the content better?The industrial chain of AIGCAdvantages of large-scale pre-trained modelsGeneration of smart textPros of AIGCCons of AIGCAIGC and Metaverse 挑战潜…

【Vue】Vue.js中常见的几种语法

在 Vue.js 中&#xff0c;主要的语法可以分为以下几种&#xff1a; 插值语法 (Interpolation) 使用双大括号 {{ }} 进行文本插值。 示例&#xff1a; {{ message }} 指令语法 (Directives) 指令是特殊的标记&#xff0c;用于告诉Vue框架如何操作DOM。Vue提供了多种内置指…

算法基础-----【动态规划】

动态规划(待完善) 动规五部曲分别为&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式&#xff08;状态转移公式&#xff09;dp数组如何初始化确定遍历顺序举例推导dp数组、 动态规划的核心就是递归剪枝&#xff08;存储键值&#xff0c;…

有人物联的串口服务器USR-TCP232-410S基本测试通信和使用方案(485串口和232串口)

1.将 410S(USR-TCP232-410S&#xff0c;简称 410S 下同)的串口通过串口线(或USB 转串口线)与计算机相连接&#xff0c;通过网线将 410S 的网口 PC 的网口相连接&#xff0c;检测硬件连接无错误后&#xff0c;接入我们配送的电源适配器&#xff0c;给 410S 供电。观察指示灯状态…

Python面试宝典第1题:两数之和

题目 给定一个整数数组 nums 和一个目标值 target&#xff0c;找出数组中和为目标值的两个数的索引。可以假设每个输入只对应唯一的答案&#xff0c;且同样的元素不能被重复利用。比如&#xff1a;给定 nums [2, 7, 11, 15] 和 target 9&#xff0c;返回 [0, 1]&#xff0c;因…

《数据仓库与数据挖掘》 总复习

试卷组成 第一章图 第二章图 第三章图 第四章图 第五章图 第六章图 第九章图 第一章 DW与DM概述 &#xff08;特点、特性&#xff09; DB到DW 主要特征 &#xff08;1&#xff09;数据太多&#xff0c;信息贫乏&#xff08;Data Rich&#xff0c; Information Poor)。 &a…