list(链表)容器(二)
一、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(const list<int>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << (*it) << " ";}cout << endl;
}void test()
{list<int>L;//尾插L.push_back(10);L.push_back(20);L.push_back(30);//头插L.push_front(100);L.push_front(200);L.push_front(300);//300 200 100 10 20 30printList(L);//尾删 300 200 100 10 20L.pop_back();printList(L);//头删 200 100 10 20L.pop_front();printList(L);//insert插入 200 1000 100 10 20list<int>::iterator it = L.begin();L.insert(++it,1000);printList(L);//删除 200 100 10 20it = L.begin();L.erase(++it);printList(L);//移除L.push_back(10000);L.push_back(10000);L.push_back(10000);L.push_back(10000);printList(L);L.remove(10000);//删除所有printList(L);//清空L.clear();printList(L);
}int main()
{test();return 0;
}
总结:
尾插 --- push_back 尾删 --- pop_back
头插 --- push_front 头删 --- pop_front
插入 --- insert 删除 --- erase
移除 --- remove 清空 --- clear
二、list 数据存取
函数原型:
front(); //返回第一个元素。
back(); //返回最后一个元素。
代码示例:
#include<iostream>
using namespace std;
#include<list>void test()
{list<int>L1;L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//L1[0] 不可以用[]访问list容器中的元素//L1.at(0) 不可以用at访问list容器中的元素//原因是list本质为链表,不适用连续线性空间存储数据,迭代器也是不支持随机访问的cout << "第一个元素为:" << L1.front() << endl;cout << "最后一个元素为:" << L1.back() << endl;//验证迭代器是不支持随机访问的list<int>::iterator it = L1.begin();it++;//it--,支持双向,但写成it=it+1则出错,不支持随机访问
}int main()
{test();return 0;
}
总结:
list容器中不可以通过[]或者at方式访问数据
返回第一个元素 --- front
返回最后一个元素 --- back
三、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;
}void test01()
{//反转链表list<int>L1;L1.push_back(20);L1.push_back(10);L1.push_back(50);L1.push_back(40);L1.push_back(30);cout << "反转前:" << endl;printList(L1);//反转L1.reverse();cout << "反转后:" << endl;printList(L1);
}bool myCompare(int v1,int v2)
{//降序 就让第一个数 > 第二个数return v1 > v2;
}//排序链表
void test02()
{list<int>L1;L1.push_back(20);L1.push_back(10);L1.push_back(50);L1.push_back(40);L1.push_back(30);//排序cout << "排序前:" << endl;printList(L1);//所有不支持随机访问迭代器的容器,不可以用标准算法// 不支持随机迭代器访问的容器,内部会提供一些对应算法//sort(L1.begin(), L1.end());L1.sort();//默认排序规则 从小到大 升序cout << "排序后:" << endl;printList(L1);L1.sort(myCompare);printList(L1);
}int main()
{//test01();test02();return 0;
}
总结:
反转 --- reverse
排序 --- sort (成员函数)
四、排序案例
案例描述:将Person自定义数据类型进行排序,Person中属性有姓名、年龄、身高
排序规则:按照年龄进行升序,如果年龄相同按照身高进行降序
代码示例:
#include<iostream>
using namespace std;
#include<list>
#include<string>//list容器 排序案例
class Person
{
public:Person(string name, int age, int height){this->m_Name = name;this->m_Age = age;this->m_Height = height;}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 test()
{//创建容器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<Person49>::iterator it = L.begin(); it != L.end(); it++){cout << "姓名:" << (*it).m_Name << " 年龄:" << (*it).m_Age << " 身高:" << (*it).m_Height << endl;}//排序cout << "----------------------------" << 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()
{test();return 0;
}
总结:
对于自定义数据类型,必须要指定排序规则,否则编译器不知道如何进行排序
高级排序只是在排序规则上再进行一次逻辑规则制定,并不复杂
相关文章:
list(链表)容器(二)
一、list 插入和删除 函数原型: push_back(elem);//在容器尾部加入一个元素 pop_back();//删除容器中最后一个元素 push_front(elem);//在容器开头插入一个元素 pop_front();//从容器开头移除第一个元素 insert(pos,elem);//在pos位置插elem元素的拷贝,…...
世优科技上榜2024年度《中国虚拟数字人影响力指数报告》
日前,第三期《中国虚拟数字人影响力指数报告》在中国网络视听大会上正式发布。本期《报告》由中国传媒大学媒体融合与传播国家重点实验室(以下简称“国重实验室”)、中国传媒大学数字人研究院编制,中国网络视听协会、人民日报智慧…...
【调试方法】C代码中dump中间数据的方法
一,简介 本文主要介绍,如何在C语言代码中将音频流数据进行写入文件,方便调试定位问题: 二,函数实现 按int8_t写入 #include <stdio.h>int32_t write_int8_t_data(int8_t *name, int8_t *buffer, int32_t dat…...
【BUG】vue中@change时间传值丢失问题
项目场景: 在修改项目bug时,发现后端响应到前端的值,通过change事件调用方法,在方法中拿到值时,有部分数据丢失。 问题描述 后端传到前端的值为:字符串类型的"00000089",change调用…...
Linux提权!!!
上一篇文章讲了Windows的提权,那么这篇文章就来讲一下Linux的提权 1.SUID提权 suid权限 作用:让普通用户临时拥有该文件的属主的执行权限,suid权限只能应用在二进制可执行文件(命令)上,而且suid权限只能设置…...
Android Studio学习7——常用控件view
Android控件 双击shift键——>搜索想要找的文件 Ctrlshift回车——>补全“;”号 CtrlX——>删除一行,只需把鼠标放在那一行 windows自带字体...
Springboot3 集成knife4j(swagger)
knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍! 官网地址: Knife4j 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j 本文以Springboot3版本集成kn…...
深信服:借助观测云实现全链路可观测性
导读 深信服科技股份有限公司 简称「深信服」( Sangfor Technologies Inc. ),是一家领先的网络安全和云计算解决方案提供商,致力于为全球客户提供高效、智能、安全的网络和云服务。随着公司业务的不断扩展,也面临着监…...
详解Qt中使用线程
详解Qt中使用线程 Qt中的线程相关知识涵盖了线程创建、管理、通信以及线程安全等方面。下面将详细讲解这些知识点,并提供对应的示例代码。 线程创建与管理 QThread类 Qt通过QThread类来创建和管理线程。要创建一个新的工作线程,通常有两种方法&#…...
在.Net6中用gdal实现第一个功能
目录 一、创建.NET6的控制台应用程序 二、加载Gdal插件 三、编写程序 一、创建.NET6的控制台应用程序 二、加载Gdal插件 Gdal的资源可以经过NuGet包引入。右键单击项目名称,然后选择 "Manage NuGet Packages"(管理 NuGet 包)。N…...
采用大语言模型进行查询重写——Query Rewriting via Large Language Models
文章:Query Rewriting via Large Language Models,https://arxiv.org/abs/2403.09060 摘要 查询重写是在将查询传递给查询优化器之前处理编写不良的查询的最有效技术之一。 手动重写不可扩展,因为它容易出错并且需要深厚的专业知识。 类似地…...
使用Vue实现CSS过渡和动画
01-初识动画和过渡 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>使用vue实现css过渡和动画&l…...
一家购物商场的数据运营挑战
✅作者简介:《数据运营:数据分析模型撬动新零售实战》作者、《数据实践之美》作者、数据科技公司创始人、多次参加国家级大数据行业标准研讨及制定、高端企培合作讲师。 🌸公众号:风姑娘的数字视角,免费分享数据应用相…...
React Native框架开发APP,安装免费的图标库(react-native-vector-icons)并使用详解
一、安装图标库 要使用免费的图标库,你可以使用 React Native Vector Icons 库。 首先,确保你已经安装了 react-native-vector-icons: npm install --save react-native-vector-iconsnpm install --save-dev types/react-native-vector-ic…...
idea端口占用
报错:Verify the connector‘s configuration, identify and stop any process that‘s listening on port XXXX 翻译: 原因: 解决: 一、重启大法 二、手动关闭 启动spring项目是控制台报错,详细信息如下ÿ…...
MQ消息队列详解以及MQ重复消费问题
MQ消息队列详解以及MQ重复消费问题 1、解耦2、异步调用3、流量削峰4、MQ重复消费问题,以及怎么解决?4.1、重复消费产生4.2、解决方法: https://blog.csdn.net/qq_44240587/article/details/104630567 核心的就是:解耦、异步、削锋…...
系统IO函数接口
目录 前言 一. man手册 1.1 man手册如何查询 1.2 man手册基础 二.系统IO函数接口 三.open打开文件夹 3.1 例1 open打开文件 3.2 open打开文件代码 3.3 例2 创建文件 四.write写文件 4.1 write写文件 五. read读文件 5.1 read读文件与偏移 5.2 偏移细节 5.3 read读文件代码 六.复…...
06 监听器
文章目录 SessionAttListenerDemo.javaSessionListenerDemo.javaProductController.java SessionAttListenerDemo.java package com.aistart.listener;import javax.servlet.ServletContext; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSess…...
C语言第三十九弹---预处理(上)
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 预处理 1、预定义符号 2、#define定义常量 3、#define定义宏 4、带有副作用的宏参数 5、宏替换的规则 6、宏和函数的对比 总结 在C语言中,预处…...
计算机视觉无人驾驶技术:入门指南
I. 引言: 计算机视觉无人驾驶技术是一种基于计算机视觉和机器学习技术的自动化驾驶技术。它可以通过搭载各种传感器和摄像机,让车辆自主感知周围环境,实现尽可能自动化的驾驶操作。 这种技术具有重要性和优势,包括: …...
给IPC相机调图像,别再瞎调了!一份保姆级的ISP线性模式调试顺序图(附避坑要点)
IPC相机图像调试实战指南:从线性模式到专业级画质优化 刚接触IPC相机图像调试的工程师们,常常会陷入参数迷宫——面对AE、AWB、Gamma、3DNR等数十个模块,该从何处入手?调试顺序的错误可能导致反复返工,甚至影响最终成像…...
VCF 9.1 新特性:安装器与 Fleet Depot 支持 HTTP 无认证离线软件源
VMware Cloud Foundation(VCF)9.0 推出了统一软件仓库(Software Depot),支持连接博通在线源或企业内部离线源。但在 9.0 中,离线源默认必须使用 HTTPS 基础认证,即使关闭 HTTPS 也依然需要认证,对纯内网环境很不友好。在 VCF 9.1…...
Vivado 伪双口RAM IP核的配置精髓与实战避坑指南
1. 伪双口RAM的本质与真双口RAM的差异 第一次接触伪双口RAM(Simple Dual Port RAM)时,很多人会疑惑它和真双口RAM(True Dual Port RAM)到底有什么区别。这个问题困扰了我很久,直到在实际项目中踩了几个坑才…...
LIO-SAM源码逐行解析:从因子图构建到多传感器融合实战
1. LIO-SAM技术架构解析 LIO-SAM(Lidar Inertial Odometry via Smoothing and Mapping)是Tixiao Shan博士在LeGO-LOAM基础上开发的激光-惯性紧耦合SLAM系统。它的核心创新点在于采用因子图优化框架,将IMU预积分、激光里程计、GPS和闭环检测四…...
STM32CubeMX实战指南:基本定时器中断配置与精准延时应用
1. 认识STM32基本定时器 第一次接触STM32定时器时,我完全被各种类型的定时器搞晕了。直到后来才发现,基本定时器其实是最好上手的。STM32F1系列通常包含TIM6和TIM7两个基本定时器,它们就像电子表里的秒表功能 - 只能计时,没有花哨…...
从零到精通Gemini Deep Research:手把手带跑通生物医药/法律/金融三大垂直领域真实案例
更多请点击: https://intelliparadigm.com 第一章:Gemini Deep Research功能概览与核心价值 Gemini Deep Research 是 Google 推出的面向专业研究者的增强型推理能力模块,专为处理长上下文、跨文档溯源、多跳逻辑推演与学术可信验证而设计。…...
flux_down 下载工具使用步骤详解(附FluxDown多线程下载与磁力解析教程)
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
JScope RTT模式实战:在GD32F303上实现1MB/s高速数据流录制与性能分析
JScope RTT模式实战:在GD32F303上实现1MB/s高速数据流录制与性能分析 在嵌入式系统开发中,实时数据采集与分析往往是调试过程中最具挑战性的环节之一。当工程师需要捕捉高速瞬态信号、分析多变量交互行为或进行故障诊断时,传统调试工具常常显…...
OpenOCD实战:从源码编译到JTAG调试RISC-V平台
1. OpenOCD与RISC-V调试基础 第一次接触OpenOCD调试RISC-V芯片时,我对着开发板上的JTAG接口发了半天呆。作为嵌入式开发者,我们都经历过这种从零搭建调试环境的阵痛期。OpenOCD就像一位硬件调试的瑞士军刀,它能通过JTAG接口与各种处理器架构对…...
B站缓存视频终极转换指南:3分钟将m4s文件无损转为通用MP4格式
B站缓存视频终极转换指南:3分钟将m4s文件无损转为通用MP4格式 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的…...
