73.list

【C++STL基础入门】list的增、删 在C++中,STL(Standard Template Library)是一个功能强大且常用的程序库,它为我们提供了许多容器和算法,使得编写高效且可维护的代码变得更加容易。其中,list是STL中的一个双向链表容器,它可以在任意位置高效地插入和删除元素。本文将介绍list容器的基本用法,包括如何增加和删除其中的元素。功能:将元素 val 插入到list容器的开头。参数:val - 要插入的元素的值。返回值:无返回值。// 输出:5 10return 0; 阅读详情

List容器是一个双向链表

                     

  1. List容器
    1. 赋值、构造、大小、为空、删除 、添加
    2. 移除 remove( 10 )  删除容器中所有与10 匹配的元素
    3. 双向循环链表
    4. 迭代器是不支持随机访问的
    5. 反转排序
      1. reverse 反转
      2. 排序 成员函数 sort
      3. 默认排序 从小到大
      4. 自定义数据类型,必须指定排序规则
      5. 高级
    6. remove删除list容器中自定义数据类型

main.cpp

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <list>
#include <algorithm>
#include <string>
using namespace std;

//list是双向循环链表
void test01()
{
	list<int> myList;
	for (int i = 0; i < 10; i++){
		myList.push_back(i);
	}

	list<int>::_Nodeptr node = myList._Myhead->_Next;

	for (int i = 0; i < myList._Mysize * 2; i++){
		cout << "Node:" << node->_Myval << endl;
		node = node->_Next;
		if (node == myList._Myhead){
			node = node->_Next;
		}
	}


}

//list常用API
/*
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值匹配的元素。
*/

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

void test02()
{
	list<int>L(10, 10);
	list<int>L2(L.begin(), L.end());

	printList(L);//输出:10 10 10 10 10 10 10 10 10 10
	printList(L2);//输出:10 10 10 10 10 10 10 10 10 10
	L2.push_back(100);

	//逆序打印
	for (list<int>::reverse_iterator it = L2.rbegin(); it != L2.rend(); it++)
	{
		cout << *it << " ";//输出:100 10 10 10 10 10 10 10 10 10 10
	}
	cout << endl;

	//list迭代器不支持随机访问
	list<int>::iterator itBegin = L2.begin();
	//itBegin = itBegin + 1;


	//插入数据
	list<int>L3;
	L3.push_back(10);
	L3.push_back(30);
	L3.push_back(20);
	L3.push_front(100);
	L3.push_front(300);
	L3.push_front(200);

	printList(L3); //  200 300 100 10 30 20 

	//删除两端数据
	L3.pop_front(); //头删
	L3.pop_back(); //尾删
	printList(L3); // 300 100 10 30

	L3.insert(L3.begin(), 1000);
	printList(L3); // 1000 300 100 10 30

	//remove(elem);//删除容器中所有与elem值匹配的元素。
	L3.push_back(10);// 1000 300 100 10 30 10
	L3.remove(10); //参数 直接放值

	printList(L3);//1000 300 100  30
}


/*
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();//返回最后一个元素。
*/

void test03()
{
	list<int>L3;
	L3.push_back(10);
	L3.push_back(30);
	L3.push_back(20);
	L3.push_front(100);
	L3.push_front(300);
	L3.push_front(200);

	cout << "大小:" << L3.size() << endl;//大小:6
	if (L3.empty())//L3不为空
	{
		cout << "L3为空" << endl;
	}
	else
	{
		cout << "L3不为空" << endl;
	}

	L3.resize(10);
	printList(L3);//输出:200 300 100 10 30 20 0 0 0 0

	L3.resize(3);
	printList(L3);//输出:200 300 100

	list<int> L4;
	L4.assign(L3.begin(), L3.end());//将[L3.begin(), L3.end())区间中的数据拷贝赋值给本身。

	//200 300 100
	cout << "front: " << L4.front() << endl;//front: 200
	cout << "back: " << L4.back() << endl;//back: 100
}

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

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

void test04()
{
	list<int>L;

	L.push_back(10);
	L.push_back(20);
	L.push_back(40);
	L.push_back(30);

	L.reverse();
	printList(L); // 30 40 20 10

	//所有不支持随机访问的迭代器 不可以用系统提供的算法
	// 如果不支持用系统提供算法,那么这个类内部会提供
	//sort(L.begin(), L.end()); 
	L.sort(); //从小到大

	printList(L);// 10 20 30 40

	//从大到小
	L.sort(myCompare);
	printList(L);

}

//自定义数据类型
class Person
{
public:
	Person(string name, int age, int height)
	{
		this->m_Name = name;
		this->m_Age = age;
		this->m_Height = height;
	}

	//重载 == 让remove 可以删除自定义的person类型
	bool operator==(const  Person & p)
	{
		if (this->m_Name == p.m_Name && this->m_Age == p.m_Age && this->m_Height == p.m_Height)
		{
			return true;
		}
		return false;
	}

	string m_Name;
	int m_Age;
	int m_Height; //身高 
};

//Person排序规则 如果年龄 相同  按照身高的升序排序
bool myComparePerson(Person & p1, Person & p2)
{
	//if (p1.m_Age > p2.m_Age)
	//{
	//	return true;
	//}
	//return false;

	if (p1.m_Age == p2.m_Age)
	{
		return p1.m_Height < p2.m_Height;
	}
	else
	{
		return p1.m_Age > p2.m_Age;
	}


}

void test05()
{
	list<Person> L;

	Person p1("亚瑟", 10, 165);
	Person p2("德玛西亚", 20, 170);
	Person p3("火枪", 17, 177);
	Person p4("德雷福斯", 19, 120);
	Person p5("MT", 18, 200);
	Person p6("狗蛋", 18, 166);
	Person p7("狗剩", 18, 210);

	L.push_back(p1);
	L.push_back(p2);
	L.push_back(p3);
	L.push_back(p4);
	L.push_back(p5);
	L.push_back(p6);
	L.push_back(p7);

	//需求 打印数据时候 按照年龄的降序 输出
	//对于自定义数据类型 ,必须要指定排序规则
	L.sort(myComparePerson);
	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.remove(p6);//通过重载==实现比较来进行删除
	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();

	//test02();

	//test03();

	//test04();
	test05();

	system("pause");
	return EXIT_SUCCESS;
}

test05输出

姓名: 德玛西亚 年龄: 20 身高:170
姓名: 德雷福斯 年龄: 19 身高:120
姓名: 狗蛋 年龄: 18 身高:166
姓名: MT 年龄: 18 身高:200
姓名: 狗剩 年龄: 18 身高:210
姓名: 火枪 年龄: 17 身高:177
姓名: 亚瑟 年龄: 10 身高:165
 --------------------
姓名: 德玛西亚 年龄: 20 身高:170
姓名: 德雷福斯 年龄: 19 身高:120
姓名: MT 年龄: 18 身高:200
姓名: 狗剩 年龄: 18 身高:210
姓名: 火枪 年龄: 17 身高:177
姓名: 亚瑟 年龄: 10 身高:165

 

标准库list源码 学习STL源码的好助手,是一个非常简化版的SLT list源码,可以让你理解stl的本质 立即下载

相关推荐

Android开发实战:5分钟搞定全屏沉浸式状态栏(附完整代码示例)

本文提供了Android开发中实现全屏沉浸式状态栏的完整实战指南。通过对比主题配置、动态代码设置和Window标志位三种方法,详细讲解了如何隐藏状态栏并处理布局适配。文章还涵盖了刘海屏、手势导航等高级适配场景,并附有可直接使用的工具类代码,帮助开发者快速提升应用视觉体验。

weixin_29197699的博客 359

vs2019 c#错误列表不显示解决方法

选择build only

如鹿渴慕泉水的专栏 4279

HIC测序数据生信分析——第三节,HIC数据挂载

(取决于是否运行①prune模块,若①运行,则③运行;#HIC预处理后的比对文件Unknown_BM942-001H0001_1_val_1.Unknown_BM942-001H0001_2_val_2.hicup.bam 和contig基因组序列文件genome.fa。#HIC预处理后的比对文件Unknown_BM942-001H0001_1_val_1.Unknown_BM942-001H0001_2_val_2.hicup.bam 和contig基因组序列文件genome.fa。#这个方法简单一点。

weixin_44616693的博客 3596

VS发生生成错误,但错误列表无错误提示。

VS发生生成错误,但错误列表无错误提示。 可能原因: 1.生成项目框架版本可能低于引用项目框架版本。 解决办法: 改变生成项目框架版本,右键项目=》属性=》应用程序=》目标框架

ddy666888的博客 1万+

✔B【AD623】【单运放】仪表放大器 AD623电压放大器模块可调 单电源 单端/差分 微小信号

【】仪表放大器 AD623电压放大器模块可调 单电源 单端/差分 微小信号

童话与梦的博客 8283

【技术实战】SeaTunnel 实现 HTTP 到 Doris 数据同步的配置优化与问题解决

本文分享了使用SeaTunnel实现HTTP数据源到Doris数仓同步的实战经验。详细解析了从环境搭建、核心配置到生产部署的全流程,重点针对数据类型映射、分页拉取、依赖冲突等典型问题提供了解决方案,并给出了连接参数调优、错误处理等进阶优化技巧,帮助开发者构建稳定高效的数据同步管道。

gan8painter的博客 754

VS2019/MFC编程入门:如何使用列表视图控件List Control ?(上)

前面一节中,讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用。内容正式开始前为大家介绍一下MFC中著名的控件Xtreme ToolKit Pro: Xtreme Toolkit Pro:是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Gr

qq_42444778的博客 1661

数字IC后端PPA优化实战:Timing一致性策略与Module Region布局技巧

本文深入探讨了数字IC后端设计中的PPA优化实战,重点解析了Timing一致性问题及其解决方案。通过调整Clock Uncertainty、Timing Derate和RC Scale Factor等关键参数,使Innovus等PR工具的分析结果更接近PrimeTime签核结果。同时,文章详细介绍了Module Region布局技巧,通过为关键模块划定物理区域,优化单元摆放,有效减少线延迟,从而协同提升时序收敛效率与设计可预测性。

weixin_29218963的博客 203

vs2019 调试看不到std::list 中的值,

这一项被勾选了就会看不到std::list 中的值,QList、QMap、QVector都会看不到,单独就qt相关的容器数据看不到,就应该是qt5.natvis.xml 配置有问题。都看不到,就说明是上述图片这一项被选中了。

kaihua123 355

光学传播仿真软件:SPEOS_(14).建筑物内光环境仿真

在建筑物内光环境仿真中,材料属性的定义直接影响光的传播和反射效果。SPEOS提供了丰富的材料库,但也可以自定义材料属性以满足特定需求。创建新材料选择Materials->。输入材料名称和类型。配置材料属性选择材料对象,打开属性编辑器。设置反射率、透射率、表面粗糙度和颜色。# 导入SPEOS模块# 创建新材料# 配置材料属性custom_material.set_reflectivity(0.8) # 设置反射率为0.8。

kkchenjj的博客 1249

非结构化数据在大数据湖中的应用实践

想象一下,你正在整理一个杂乱的书房。有些书整整齐齐地放在书架上,每本书都有明确的标题、作者和出版日期——这些就是结构化数据,它们像数据库中的表格,有固定的格式和字段。但书房里还有更多东西:散落的照片、手写的笔记、录音带、视频光盘、甚至还有画作。这些物品没有固定的格式,每件都独一无二——这就是非结构化数据。在技术术语中,非结构化数据是指没有预定义数据模型或组织形式的信息。文本文档(Word、PDF、TXT)电子邮件和社交媒体内容图像和照片(JPG、PNG)音频文件(MP3、WAV)

软件工程实践的博客 361

73.List接口介绍;List接口常用方法

List接口介绍 【特征】 List接口是有序的,可重复的; 有序:添加顺序与保存顺序保持一致; 【分类】 主要分为三种集合: ·ArrayList<E> 可变长数组; ·LinkedList<E>双向链表; ·Vector<E>线程安全的可变长数组; List接口常用方法 <1>boolean add(E e); 向集合中增加元素,List接口继承Collection接口 add方法;使用操作和Collection一致,并且这里采用的添加方式是【

嘻哈怪才的博客 906

【漏洞复现】用友NC-Cloud-反序列化-ResourceManagerServlet

NC Cloud是用友公司推出的大型企业数字化平台。支持公有云、混合云、专属云的灵活部署模式。NC Cloud完全基于云原生架构,技术先进、性能稳定、自主安全可控,支撑大中型以及超大型集团企业N层多site混合云部署方案,支持整个系统高可用、弹性扩展、双/多活,以及快速灾备恢复能力等。用友-NC-Cloud ResourceManagerServlet 接口存在反序列化漏洞,使得攻击者可以通过构造特定的请求远程执行恶意代码。此漏洞可能导致攻击者获取系统权限、执行任意命令,严重威胁系统的机密性和完整性。

漏洞复现 1366

[C++]LeetCode: 73 Linked List Cycle

题目: Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 思路:使用快慢两个指针。开始时,两个指针同时指向head,之后slow每次前行一步,fast每次前行两步。如果链表有环,这两个指针一定会相遇,如果没有

cindy_niu的专栏 970

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

73. 以及python中列表(List)的定义,创建以及列表的特性

Lesson 73 python中列表(List)的定义及创建列表 文章目录1. python中列表的定义2. python中列表的创建3. python中列表的嵌套3. python中列表的特性3.1 索引3.2 切片3.3 重复3.4 连接3.5 成员操作符4. 列表小练习5. 列表综合练习 1. python中列表的定义 列表是Python中最基本的数据结构 列表中的每个元素都分配一个位置,...

qq_43687755的博客 5328

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【List<Map<String,Object>>】Map中多个属性转成List Map(73)

1.Map中多个属性转成List Map

qq_42139049的博客 1289

5月21日,layer list drawable,Android 开发,每日20行,第73天。

BeatBox.java package com.example.aster.beatbox; import android.content.Context; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.media.AudioM...

Aster_tataricus的博客 134

Java编程的逻辑 (73) - 并发容器 - 写时拷贝的List和Set

​本系列文章经补充和完善,已修订整理成书《Java编程的逻辑》,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http://item.jd.com/12299018.html 本节以及接下来的几节,我们探讨Java并发包中的容器类。本节先介绍两个简单的类CopyOnWriteArrayList和CopyOnWr...

101

java 容器复制_Java编程的逻辑 (73) - 并发容器 - 写时拷贝的List和Set

本节以及接下来的几节,我们探讨Java并发包中的容器类。本节先介绍两个简单的类CopyOnWriteArrayList和CopyOnWriteArraySet,讨论它们的用法和实现原理。它们的用法比较简单,我们需要理解的是它们的实现机制,Copy-On-Write,即写时拷贝或写时复制,这是解决并发问题的一种重要思路。CopyOnWriteArrayList基本用法CopyOnWriteArray...

weixin_42152298的博客 222

Cannot serialize session attribute list for session 9C6CC5D037317CDE443E5EFEEBEDFD73

问题:不能序列化解决方法:在要序列化的类上加上实现方法: implements Serializable

zrcshendustudy的博客 1220

计算机程序的思维逻辑 (73) - 并发容器 - 写时拷贝的List和Set

本系列文章经补充和完善,已修订整理成书《Java编程的逻辑》(马俊昌著),由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买:京东自营链接 本节以及接下来的几节,我们探讨Java并发包中的容器类。本节先介绍两个简单的类CopyOnWriteArrayList和CopyOnWriteArraySet,讨论它们的用法和实现原理。它们的用法比较简单,...

weixin_33911824的博客 172

*** glibc detected *** mainwindow: malloc(): smallbin double linked list corrupted: 0x01a73ab8 ***

1.先看看在glibc malloc的实现机制 /*   This struct declaration is misleading (but accurate and necessary).   It declares a "view" into memory allowing access to necessary   fields at known offsets from a gi

occupy8的专栏 1万+

plsql 根据sid连接oracle

ORCL73 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.73)(PORT = 1521)) ) (CONNECT_DATA = (SID = ygdb1) (SERVER = DEDICATED) ) ) 转载于:https:...

weixin_30649859的博客 3531

二、设置地图配置表

由于背景图比较大,需要缩小至0.73。

akjhgi的博客 314

threejs报错A WebGL context could not be created.

参考链接:https://blog.csdn.net/jiangxinyu50/article/details/130572504。4、Chrome 73之后的版本, 确保Choose ANGLE graphics backend 为"OpenGL"。2、将 Override software rendering list 选项设为"Enabled"。3、WebGL Draft Extentions 选项改为 enbale。1、在浏览器地址栏输入 chrome://flags/。

weixin_43485503的博客 1985
上一篇: 72.Queue
下一篇: 74.set,multiset和pair
augfun
博客等级 码龄10年 311粉丝 662原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值