20230507,LIST容器

news2024/12/27 2:35:21

学了又忘学了又忘,明知道会忘又不想复习又还得学

LIST容器

1.1 基本概念

 链表是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序通过链表中的指针链接实现的;链表由一系列结点组成
结点:一个是存储数据元素的数据域,一个是存储下一个结点地址的指针域
STL中的链表是一个双向循环链表,迭代器只支持前移和后移(不支持跳跃式访问),属于双向迭代器

优点:可以对任意位置进行快速插入或删除元素,操作方便,修改指针即可,不需要移动大量元素;动态内存分配,不会造成内存浪费和溢出
缺点:容器遍历速度没有数组快,占用空间比数组灵活,但空间(指针域)和时间(遍历)额外耗费巨大

LIST有一个重要的性质,插入和删除都不会造成原有LIST迭代器的失效,这在VECTOR里面是不成立的
STL中LIST和VECTOR是两个最常使用容器,各有优缺点

1.2 构造函数

 list<T> lst;             //采用模板类实现,对象的默认构造形式
list(beg,end);            //首尾区间拷贝
list(n,elem);             //N个ELEM拷贝
list(const list &lst);    //拷贝构造函数

#include<iostream>
#include<list>
#include<string>
using namespace std;
/*
list<T> lst;             //采用模板类实现,对象的默认构造形式
list(beg,end);            //首尾区间拷贝
list(n,elem);             //N个ELEM拷贝
list(const list &lst);    //拷贝构造函数
*/
void printl(const list<int>& l) {
	for (list<int>::const_iterator it = l.begin(); it != l .end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test01() {
	list<int>l;            // list<T> lst;
	l.push_back(10);
	l.push_back(20);
	l.push_back(30);
	l.push_back(40);
	printl(l);
	list<int>l2(l.begin(), l.end());
	printl(l2);
	list<int>l3(5,100);
	printl(l3);
	list<int>l4(l);
	printl(l4);
}
int main() {
	test01();
	system("pause");
	return 0;
}
1.3 赋值和交换

 assign(beg,end);
assign(n,elem)
list &operator=(const list &lst);
swap(lst)

#include<iostream>
#include<list>
#include<string>
using namespace std;
/*
assign(beg,end);
assign(n,elem)
list &operator=(const list &lst);
swap(lst)
*/
void printl(const list<int>& l) {
	for (list<int>::const_iterator it = l.begin(); it != l .end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void test01() {
	list<int>l;            // list<T> lst;
	l.push_back(10);
	l.push_back(20);
	l.push_back(30);
	l.push_back(40);
	printl(l);
	list<int>l2;
	l2.assign(l.begin(), l.end());
	printl(l2);
	l2.assign(9, 78);
	printl(l2);
	cout <<"l2.size()="<< l2.size() << endl;

	list<int>l3;
	l3 = l;
	printl(l3);
	cout << "l3.size()=" << l3.size() << endl;
	l3.swap(l2);
	printl(l2);
	cout << "l2.size()=" << l2.size() << endl;
	printl(l3);
	cout << "l3.size()=" << l3.size() << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}
1.4 大小操作

empty()
size()
lst.resize(n,elem)
lst.resize(n) 

#include<iostream>
#include<list>
#include<string>
using namespace std;
/*
empty()
size()
lst.resize(n,elem)
lst.resize(n)
*/
void printl(const list<int>& l) {
	for (list<int>::const_iterator it = l.begin(); it != l .end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}
void isempty(const list<int>& l) {
	if (l.empty()) {
		cout << "空" << endl;
	}
	else {
		cout << " bubu <" << endl;
		cout << " size:" << l.size() << endl;
	}
}
void test01() {
	list<int>l;            // list<T> lst;
	isempty(l);
	l.push_back(10);
	l.push_back(20);
	l.push_back(30);
	l.push_back(40);
	printl(l);
	isempty(l);
	l.resize(10, 99);
	printl(l);
	isempty(l);
	l.resize(2);
	printl(l);
	isempty(l);
}
int main() {
	test01();
	system("pause");
	return 0;
}
1.5 插入和删除——代码有BUG,暂时搞不懂

push_back(elem)    push_front(elem)    pop_back()     pop_front()
insert(pos,elem)返回新数据位置    insert(pos,n,elem)无返回值    insert(n,beg,end)无返回值
cleae()    erase(beg,end)返回下一个数据位置    erase(pos)返回下一个数据位置  
remove(elem)删除容器中所有值与ELEM匹配的元素 

#include<iostream>
#include<list>
#include<string>
using namespace std;
/*
push_back(elem)  push_front(elem)  pop_back()   pop_front()
insert(pos,elem)返回新数据位置  insert(pos,n,elem)无返回值  insert(n,beg,end)无返回值
cleae()  erase(beg,end)返回下一个数据位置  erase(pos)返回下一个数据位置  
remove(elem)删除容器中所有值与ELEM匹配的元素
*/
void printl(const list<int>& l) {
	for (list<int>::const_iterator i = l.begin(); i != l .end(); i++) {
		cout << *i<< " ";
	}
	cout << endl;
}
void isempty(const list<int>& l) {
	if (l.empty()) {
		cout << "空" << endl;
	}
	else {
		cout << " bubu <" << endl;
		cout << " size:" << l.size() << endl;
	}
}
void test01() {
	list<int>l;         
	l.push_back(10);
	l.push_back(20);
	l.push_back(30);
	l.push_back(40);
	l.push_front(111);
	l.push_front(222);
	l.push_front(333);
	printl(l);
	isempty(l);
	l.pop_back();
	l.pop_front();
	printl(l);
	list<int>::iterator it = l.begin();
	//l.insert(it,10000);
	it++;
	//cout << it << endl;
	l.insert(it, 4);//在第 1 个位置后面 插入,返回新数据位置 2
	printl(l);
	it++;//it--2,it++=3
	l.insert(it, 99,3);//在第 3 个位置后面 插入,it= 4+99=103
	printl(l);
	l.insert(it,l.begin(),l.end());//在第 it 个位置后面 插入
	printl(l);

	l.erase(it);
	printl(l);

	//l.erase(it);//加上就报错,说无效参数传……*&&(*&(……
	//l.erase(l.end());//
	l.remove(3);
	printl(l);
	l.erase(l.begin());
	printl(l);
	l.clear();
	printl(l);
}
int main() {
	test01();
	system("pause");
	return 0;
}
1.6 数据存取

front()          back(),不支持中括号的方式访问,本质是链表,因为不是连续的线性空间存储数据,迭代器也不支持随机访问
++,--就是支持双向,+N就是支持随机

#include<iostream>
#include<list>
#include<string>
using namespace std;
/*
front()          back()
*/
void printl(const list<int>& l) {
	for (list<int>::const_iterator i = l.begin(); i != l .end(); i++) {
		cout << *i<< " ";
	}
	cout << endl;
}
void isempty(const list<int>& l) {
	if (l.empty()) {
		cout << "空" << endl;
	}
	else {
		cout << " bubu <" << endl;
		cout << " size:" << l.size() << endl;
	}
}
void test01() {
	list<int>l;         
	l.push_back(10);
	l.push_back(20);
	l.push_back(30);
	l.push_back(40);
	l.push_front(111);
	l.push_front(222);
	l.push_front(333);
	printl(l);
	isempty(l);
	cout << l.front() << endl;
	cout << l.back() << endl;
	
}
int main() {
	test01();
	system("pause");
	return 0;
}
1.7 反转和排序

reverse()//反转链表    sort()链表排序——升序降序

#include<iostream>
#include<list>
#include<string>
#include<algorithm>
using namespace std;
/*
reverse()//反转链表    sort()链表排序
*/
void printl(const list<int>& l) {
	for (list<int>::const_iterator i = l.begin(); i != l .end(); i++) {
		cout << *i<< " ";
	}
	cout << endl;
}
bool mycompare(int v1, int v2) {
	//降序,第一个数,大于,第二个数
	return v1 > v2;
}
void test01() {
	list<int>l;         
	l.push_back(10);
	l.push_back(20);
	l.push_back(30);
	l.push_back(40);
	l.push_front(111);
	l.push_front(222);
	l.push_front(333);
	printl(l);
	l.reverse();
	printl(l);
	//sort(l.begin(),l.end());//所有不支持随机访问迭代器的容器,不可以用标准算法
	//但容器内部会提供对应的一些算法,成员函数
	l.sort();
	printl(l);
	l.sort(mycompare);
	printl(l);
}
int main() {
	test01();
	system("pause");
	return 0;
}
1.8 排序案例——Person自定义数组类型进行排序,Person(姓名,年龄,身高)
年龄升序,年龄相同身高降序

先指定排序规则,再直接调用

#include<iostream>
#include<list>
#include<string>
using namespace std;
/*
Person自定义数组类型进行排序,Person(姓名,年龄,身高)
年龄升序,年龄相同身高降序
*/
class Person {
public:
	Person(string name, int age, int tall) {
		this->_name = name;
		this->_age = age;
		this->_tall = tall;
	}
public:
	string _name;
	int _age;
	int _tall;
};
void printl(const list<Person>& l) {
	for (list<Person>::const_iterator it = l.begin(); it != l .end(); it++) {
		cout << "选手: " << it->_name << "\t年龄: " << it->_age << "\t身高:" << it->_tall << endl;
	}
	cout << endl;
}
void setpp(list<Person>& l) {
	Person p1("有哈", 18, 180);
	Person p2("hhki", 16, 190);
	Person p3("黄金分割", 22, 210);
	Person p4("会后i", 16, 130);
	Person p5("经济", 30, 150);
	l.push_back(p1);
	l.push_back(p2);
	l.push_back(p3);
	l.push_back(p4);
	l.push_back(p5);
}
void setpp2(list<Person>& l) {
	srand((unsigned int)time(NULL));
	string nameseed = "abcde";
	for (int i = 0; i < 5; i++) {
		string name = "选手";
		name += nameseed[i];
		int age = rand() % 21 + 20;
		int tall = rand() % 51 + 150;
		Person p(name, age, tall);
		l.push_back(p);
	}
}
//指定排序规则
bool mycompare(Person&p1,Person&p2) {
	if (p1._age == p2._age) {
		return p1._tall < p2._tall;
	}
	else {
		return p1._age < p2._age;
	}
}
void test01() {
	list<Person>l;         
	//setpp(l);
	setpp2(l);
	printl(l);
	l.sort(mycompare);
	printl(l);
}
int main() {
	test01();
	system("pause");
	return 0;
}

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

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

相关文章

《ESP8266通信指南》12-Lua 固件烧录

往期 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ESP8266通信指南》9-TCP通信&#xff08;Arudino开发&#xff09;-CSDN博客 《ESP8266通信指南》8-连接WIFI&#xff08;Arduino开发…

循环链表 -- c语言实现

#pragma once // 带头双向循环链表增删查改实现 #include<stdlib.h> #include<stdio.h> #include<assert.h>typedef int LTDataType;typedef struct ListNode {LTDataType data;struct ListNode* next;struct ListNode* prev; }ListNode;//双链表申请一个新节…

【Python】PTA 查验身份

知识点&#xff1a; 1.这里的加权求和就是指每一位乘以题目给的对应位置上的数字 在python中&#xff0c;对于int(10)这样的转换而来的直接是整数10&#xff0c;但是在c语言中会转换成ASCII值&#xff0c;所以要特别注意 2.本题中有两种情况是错误的&#xff0c;就是要直接输…

DES加密解密算法(简单、易懂、超级详细)

目录 一、基础补充 二、什么是DES算法 &#xff08;1&#xff09;对称加密算法 &#xff08;2&#xff09;非对称加密算法 &#xff08;3&#xff09;对称加密算法的应用 三、DES算法的基础操作步骤 1.明文的加密整体过程 2.F轮函数解析 3.密钥的形成过程 四、AC代码 五、D…

自然语言(NLP)

It’s time for us to learn how to analyse natural language documents, using Natural Language Processing (NLP). We’ll be focusing on the Hugging Face ecosystem, especially the Transformers library, and the vast collection of pretrained NLP models. Our proj…

JuiceFS v1.2-beta1,Gateway 升级,多用户场景权限管理更灵活

JuiceFS v1.2-beta1 今天正式发布。在这个版本中&#xff0c;除了进行了大量使用体验优化和 bug 修复外&#xff0c;新增三个特性&#xff1a; Gateway 功能扩展&#xff1a;新增了“身份和访问管理&#xff08;Identity and Access Management&#xff0c;IAM&#xff09;” 与…

WHM中如何查看磁盘使用情况

今日看到有用户在论坛留言反馈他买了Hostease 独立服务器并购买cPanel面板&#xff0c;想要通过面板查看当前服务器使用的磁盘情况&#xff0c;但是不知道如何查看。因为这边也是对于cPanel即WHM面板有是有所了解的&#xff0c;对于这个用户的问题&#xff0c; 操做步骤如下&am…

【Linux】Docker 安装部署 Nacos

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 【Linux】Docker 安装部署 Nacos docker搜索na…

看完这篇文章我奶奶都懂Opentracing了(一)

前言 如果要基于Opentracing开发分布式链路追踪Java客户端工具包&#xff0c;首先肯定需要了解Opentracing中的各种概念&#xff0c;包括但不限于Span和Scope等&#xff0c;其实这些概念在Opentracing的官方文档中是有比较详尽的说明的&#xff0c;英文不好也能靠着机器翻译读…

【linux-IMX6ULL中断配置流程】

目录 1. Cortex-A7和GIC中断概述1. 1 Cortex-A7中断系统&#xff1a;1. 2 GIC中断控制器简介&#xff1a; 2. 中断配置概述3. 底层中断文件配置3.1 对启动文件.s的配置思路3.2 对中断函数配置思路 4. 上层中断配置流程 1. Cortex-A7和GIC中断概述 学习IMX6UL的中断处理系统&…

毕业就业信息|基于Springboot+vue的毕业就业信息管理系统的设计与实现(源码+数据库+文档)

毕业就业信息管理系统 目录 基于Springboot&#xff0b;vue的毕业就业信息管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1学生信息管理 2 公司信息管理 3公告类型管理 4公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设…

自动化运维管理工具 Ansible-----【inventory 主机清单和playbook剧本】

目录 一、inventory 主机清单 1.1inventory 中的变量 1.1.1主机变量 1.1.2组变量 1.1.3组嵌套 二、Ansible 的脚本 ------ playbook&#xff08;剧本&#xff09; 2.1 playbook介绍 2.2playbook格式 2.3playbooks 的组成 2.4playbook编写 2.5运行playbook 2.5.1ans…

如何翻译外文文献【攻略】

如何翻译外文文献【攻略】 前言版权推荐如何翻译外文文献简单描述第一步 准备一篇外文文献第二步 翻译网站第三步 解锁文档第四步 编辑dpf第五步 pdf转为word第六步 编辑word方便操作快捷键设置章节设置页眉页脚设置页码三线表的绘制 第七步 word转为pdf 最后 前言 2024-5-7 1…

电脑提示“无法定位程序输入点kernel32.dll”怎么解决?分享kernel32.dll丢失的五个修复方法

打开游戏或者软件的时候&#xff0c;电脑提示由于找不到kernel32.dll&#xff0c;无法继续执行此代码怎么办&#xff0c;其实修复起来不难。首先需要先知道怎么是dll文件&#xff0c;dll文件可以简单的把库文件看成一种代码仓库&#xff0c;它提供给使用者一些可以直接拿来用的…

【SSM进阶学习系列丨分页篇】PageHelper 分页插件集成实践

文章目录 一、说明什么是分页PageHelper介绍 二、导入依赖三、集成Spring框架中四、编写Service五、编写Controller六、编写queryAllByPage页面展示数据 一、说明 什么是分页 ​ 针对分页&#xff0c;使用的是PageHelper分页插件&#xff0c;版本使用的是5.1.8 。 ​ 参考文档…

openEuler 22.03 GPT分区表模式下磁盘分区管理

目录 GPT分区表模式下磁盘分区管理parted交互式创建分区步骤 1 执行如下步骤对/dev/sdc磁盘分区 非交互式创建分区步骤 1 输入如下命令直接创建分区。 删除分区步骤 1 执行如下命令删除/dev/sdc1分区。 GPT分区表模式下磁盘分区管理 parted交互式创建分区 步骤 1 执行如下步骤…

Day 24 数据库管理及数据类型

数据库管理及数据类型 一&#xff1a;数据类型 1.数值类型 整数类型 ​ 整数类型&#xff1a;TINYINT SMALLINT MEDIUMINT INT BIGINT ​ 作用&#xff1a;用于存储用户的年龄、游戏的Level、经验值等 浮点数类型 ​ 浮点数类型&#xff1a;FLOAT DOUBLE ​ 作用&#xf…

2024 cleanmymac有没有必要买呢,全反面分析

在使用mac时&#xff0c;小编遇到了运行内存不足、硬盘空间不足的情况。遇到这种情况&#xff0c;我们可以借助经典的电脑深度清理软件——CleanMyMac X&#xff0c;清理不常用的软件和系统垃圾&#xff0c;非常好用&#xff01;不过&#xff0c;有许多网友发现CleanMyMac X有免…

基于Springboot的校园新闻管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园新闻管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

NFTScan 与 Scattering 达成合作伙伴,双方将共同解决混合 NFT 数据需求

在区块链领域&#xff0c;NFT 的创新与发展从未停止。近日&#xff0c;NFT 数据基础设施 NFTScan 与一站式混合 NFT 交易市场 Scattering 达成合作伙伴关系&#xff0c;双方将在 NFT 数据层面展开合作&#xff0c;共同解决混合 NFT 的独特数据需求&#xff0c;Scattering 在协议…