Day15 C++STL入门基础知识九——list容器 基本概念-构造函数-赋值变换-大小操作-插入删除-数据存取-反转排序 【全面深度剖析+例题代码展示】

news2024/12/26 11:07:14

文章目录

    • 1. 基本概念
      • 1.1 功能
      • 1.2 概念
      • 1.3 组成和存储方式
      • 1.4 优缺点
      • 1.4 图解
  • 2. 构造函数
    • 2.1 函数原型
    • 2.2 代码展示
    • 2.3 测试结果
  • 3. 赋值交换
    • 3.1 函数原型
    • 3.2 代码展示
    • 3.3 测试结果
  • 4. 大小操作
    • 1.3 代码展示
    • 1.4 测试结果
  • 6. 插入删除
    • 6.1 函数原型
    • 6.2 代码展示
    • 6.3 测试结果
  • 7. 数据存取
    • 7.1 函数原型
    • 7.2 代码展示
    • 7.3 测试结果
  • 8. 反转排序
    • 8.1 函数原型
    • 8.2 代码展示
    • 8.3 测试结果
  • 9. 自定义数据类型排序案例
    • 9.1 题目
    • 9.2 代码展示
    • 9.3 测试结果
  • 感谢大家支持u ^ _ ^

1. 基本概念

1.1 功能

  • 将数据进行链式存储

1.2 概念

  • list是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。STL中的链表是一个双向循环链表

1.3 组成和存储方式

  • 链表的组成:链表由一系列结点组成
  • 结点的组成:是一个储存元素的数据域,另一个存储下一个结点地址的指针域
  • 链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器

1.4 优缺点

  • 优点:
    • 采用动态存储分配,不会造成内存的浪费和溢出
    • 方便插入和删除,直接修改指针即可,不需移动大量元素
    • 插入删除都不会造成原有list迭代器失效,这在vector是不成立的。
  • 缺点:
    • 链表灵活,但空间(指针域)和时间(遍历)额外耗费较大

1.4 图解

在这里插入图片描述
链表

2. 构造函数

2.1 函数原型

  • list<T> lst list采用模板类实现,对象的默认构造形式
  • list(beg,end); 构造函数将[beg,end)区间中的元素拷贝给本身
  • list(n,elem); 构造函数将n个elem拷贝给本身
  • list(const list &lst); 拷贝构造函数

2.2 代码展示

#include<stdio.h>
#include<iostream>
#include<list>
using namespace std;

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

void text01() {

	//①默认构造
	list<int> l1;	
	l1.push_back(10);
	l1.push_back(20);
	l1.push_back(30);
	l1.push_back(40);
	l1.push_back(50);
	printList(l1);

	//②区间方式构造
	list<int> l2(++l1.begin(), --l1.end());
	printList(l2);

	//③拷贝构造
	list<int> l3 = l2;
	printList(l3);

	//④n个elem
	list<int> l4(10, 5);
	printList(l4);

}


int main() {
	text01();
	return 0;
}

2.3 测试结果

在这里插入图片描述

3. 赋值交换

3.1 函数原型

  • assign(beg,end); 将[beg, end)区间中的数据拷贝给
  • assign(n, elem); 将n个elem拷贝赋值给本身
  • list& opreator=(const list &lst); 重载等号操作符
  • swap(lst) 将lst与本身的元素互换

3.2 代码展示

#include<stdio.h>
#include<iostream>
#include<list>
using namespace std;
void printList(const list<int> l) {
	for (list<int> ::const_iterator it = l.begin(); it != l.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
	cout << "-----------------------------------------------" << endl;
}

void printList2(const list<int> l) {
	for (list<int> ::const_iterator it = l.begin(); it != l.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
void text02() {
	list<int> lst1;

	lst1.push_back(10);
	lst1.push_back(20);
	lst1.push_back(30);
	lst1.push_back(40);
	lst1.push_back(50);
	printList(lst1);

	//=赋值
	list<int> lst2(lst1);
	printList(lst2);

	//assign赋值
	list<int> lst3;
	lst3.assign(++lst2.begin()  , lst2.end());
	printList(lst3);

	//n个ele赋值
	list<int> lst4;
	lst4.assign(10, 3);
	printList(lst4);
	cout << endl;

	//交换容器
	cout << "lst3="; printList2(lst3);
	cout << "lst4="; printList2(lst4);
	swap(lst3, lst4);
	cout << "lst3="; printList2(lst3);
	cout << "lst4="; printList2(lst4);

}

int main() {
	text02();
	return 0;
}

3.3 测试结果

在这里插入图片描述

4. 大小操作

  • empty(); 判断容器是否为空
  • size(); 返回容器元素的个数
  • resize(num); 重新指定元素的长度为num,若容器变长,则用默认值重新填充位置;若变短,则末尾超出容器长度的元素被删除。
  • resize(num, elem); 重新指定元素的长度为num,若容器变长,则用elem重新填充位置;若变短,则末尾超出容器长度的元素被删除。

1.3 代码展示

#include<stdio.h>
#include<iostream>
#include<list>
using namespace std;
void printList(const list<int> l) {
	for (list<int> ::const_iterator it = l.begin(); it != l.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
	cout << "-----------------------------------------------" << endl;
}
void text03() {
	list<int> l;
	l.push_back(10);
	l.push_back(20);
	l.push_back(30);
	l.push_back(40);
	l.push_back(50);
	
	//判空
	if (l.empty()) cout << "容器为空" << endl;
	else cout << "容器不为空" << endl;

	//容器大小
	cout << "容器大小为:" << l.size() << endl;

	//重新指定大小
	l.resize(10);
	printList(l);

	l.resize(4);
	printList(l);

	//重载重新指定大小
	l.resize(10, 5);
	printList(l);
}

int main() {
	text03();
	return 0;
}

1.4 测试结果

在这里插入图片描述

6. 插入删除

6.1 函数原型

  • push_back(); 尾插
  • pop_back(); 尾删
  • push_front(elem); 在容器开头插入一个元素
  • pop_front(elem); 在容器开头移除第一个元素
  • 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匹配的元素

6.2 代码展示

#include<stdio.h>
#include<iostream>
#include<list>
using namespace std;
void printList(const list<int> l) {
	for (list<int> ::const_iterator it = l.begin(); it != l.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
	cout << "-----------------------------------------------" << endl;
}
void text04() {
	list<int> l1;

	//尾插
	l1.push_back(10);
	l1.push_back(20);
	l1.push_back(30);
	printList(l1);

	//头插
	l1.push_front(300);
	l1.push_front(200);
	l1.push_front(100);
	printList(l1);

	//尾删
	l1.pop_back();
	printList(l1);

	//头删
	l1.pop_front();
	printList(l1);

	//insert插入
	l1.insert(l1.begin(), 8);
	printList(l1);

	//insert重载
	l1.insert(++l1.begin(), 1, 9);
	printList(l1);

	list<int>::iterator it = l1.begin();
	
	//删除
	it = l1.begin();
	l1.erase(++it);
	printList(l1);

	//匹配上的全部移除
	l1.push_back(10000);
	l1.push_back(10000);
	printList(l1);
	l1.remove(10000);
	printList(l1);

	//清空
	l1.clear();
	printList(l1);
}

int main() {
	text04();
	return 0;
}

6.3 测试结果

在这里插入图片描述

7. 数据存取

7.1 函数原型

  • front(); 返回第一个元素
  • back(); 返回最后一个元素

7.2 代码展示

#include<stdio.h>
#include<iostream>
#include<list>
using namespace std;
void text05() {
	list<int> l1;
	l1.push_back(10);
	l1.push_back(20);
	l1.push_back(30);
	l1.push_back(40);
	l1.push_back(50);

	cout << l1.front() << endl;
	cout << l1.back() << endl;

	list<int> ::iterator it = l1.begin();
	//链表不是用线性空间的存储数据,迭代器不能随机访问。
	it++;	it--;  //支持双向
	//it += 1;   报错 ==> 不支持随机访问
}


int main() {
	text05();
	return 0;
}

7.3 测试结果

在这里插入图片描述

8. 反转排序

8.1 函数原型

  • reverse(); 反转
  • sort(); 排序

8.2 代码展示


#include<algorithm>
bool cmp(int t1, int t2) {
	return t1 > t2;
}

void text06() {
	list<int> l1;
	l1.push_back(10);
	l1.push_back(2);
	l1.push_back(300);
	l1.push_back(50);
	l1.push_back(150);
	cout << "反转前:";  printList(l1);

	//反转
	l1.reverse();
	cout << "反转后:";  printList(l1);

	//排序
	//sort(l1.begin(), l1.end());
	//不支持随机访问迭代器的容器,内部会提供一些算法
	l1.sort(); 
	cout << "小->大排序后:";  printList(l1);
	l1.sort(cmp);
	cout << "大->小排序后:";  printList(l1);
}

int main() {
	text06();
	return 0;
}

8.3 测试结果

在这里插入图片描述

9. 自定义数据类型排序案例

9.1 题目

  • 案例描述:将Player自定义数据类型进行排序,Person中属性有姓名、年龄、得分。
  • 排序规则:按照年龄进行升序,如果年龄相同按照得分进行降序

9.2 代码展示

#include<stdio.h>
#include<iostream>
#include<string>
#include<algorithm>
#include<list>
using namespace std;

class Player {
public:
	Player(string name, int age, int score) {
		this->m_name = name;
		this->m_age = age;
		this->m_score = score;
	}
public:
	string m_name;
	int m_age;
	int m_score;
};

bool cmp(Player &p1, Player &p2) {	
	if (p1.m_age != p2.m_age) return p1.m_age < p2.m_age;
	else return p1.m_score > p2.m_score;
}

void printList(const list<Player>& l) {
	for (list<Player>::const_iterator it = l.begin(); it != l.end(); it++) {
		cout << (*it).m_name << " " << (*it).m_age << " " << (*it).m_score << endl;
	}
	cout << endl;
}

void text01() {
	//创建容器
	list<Player> l1;
	//定义数据
	Player p1("James", 38, 4000);
	Player p2("Curry", 34, 3000);
	Player p3("Irving", 30, 3500);
	Player p4("Harden", 36, 3300);
	Player p5("Durant", 34, 3800);
	//插入数据
	l1.push_back(p1);
	l1.push_back(p2);
	l1.push_back(p3);
	l1.push_back(p4);
	l1.push_back(p5);
	//打印输出
	printList(l1);
	//排序
	l1.sort(cmp);
	//打印输出
	printList(l1);
}

int main() {
	text01();
	return 0;
}


9.3 测试结果

在这里插入图片描述

感谢大家支持u ^ _ ^

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

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

相关文章

React报错#310复盘小结

React报错#310复盘小结问题背景解决方案原理&学习引发错误情况1. 不要在循环&#xff0c;条件或嵌套函数中调用 Hook2. 把所有的钩子移到组件的顶层&#xff0c;在任何可能返回值的条件之上。总结问题背景 apm报错&#xff1a;Minified React error #310 https://reactjs.…

浅谈Graph Embedding(一)

Graph Embedding算法背景引入先回顾下图的概念&#xff1a;图(graph)由节点(vertex)和点之间连线(edge)所组成&#xff1b;其中&#xff0c;点通常被成为“顶点(vertex)”,而点与点之间的连线则被成为“边”(edge)。通常记为,G(V,E)。常见分为无向图和有向图。示例如下&#xf…

MySQL数据类型约束

文章目录数据类型MySQL中的数据类型整数类型类型介绍可选属性MUNSIGNEDZEROFILL适用场景如何选择&#xff1f;浮点类型类型介绍数据精度说明精度误差说明定点数类型类型介绍开发中经验位类型&#xff1a;BIT6. 日期与时间类型YEAR类型DATE类型TIME类型DATETIME类型TIMESTAMP类型…

小白入门pwn笔记 CPU与进程的执行

1.回顾存储在磁盘中的叫节&#xff0c;映射到内存的时候叫段。内存中的节根据读写执行的权限不同在内存中映像为不同的段。段视图用于进程的内存区域的rwx权限划分。节视图用于ELF文件编译链接时与在磁盘上储存时的文件结构的组织。2.代码在内存重的映射关系不可写的数据一般会…

Qt OpenGL(三十六)——Qt OpenGL 核心模式-绘制雷达坐标系

提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 Qt OpenGL(三十六)——Qt OpenGL 核心模式-绘制雷达坐标系 一、场景 在日常的项目中,我们很多时候会遇到,绘制雷达扫描图的情况,比如,你的项目是给下面的雷达…

unidbg-boot-server使用并打包jar调用

其实线上使用可以多种方式,比如pom引入spring boot自己去写一个接口实现; 但如果并发不是很高,可以使用synchronized关键字进行,若对并发有要求,建议直接使用 unidbg-boot-server开源项目; 从github下拉,https://github.com/anjia0532/unidbg-boot-server 常见问题:…

Neo-reGeorg测试

1、前言 趁着春节刚开工不太忙&#xff0c;把以前的坑填一下。 主要是针对反向代理、隧道工具进行学习和测试。 之前测试过FRP&#xff0c;HTTPTunnel&#xff0c;NPS&#xff0c;都比较简单&#xff0c;而且上面工具也可以用在普通需求下使用。 reGeorg和Neo-reGeorg非常适合…

常用RTOS详细说明

鸿蒙OS HarmonyOS是一款面向全场景的开源分布式操作系统&#xff0c;是华为自主研发的操作系统。 鸿蒙OS实现模块化耦合&#xff0c;可应用在不同的设备上。 鸿蒙OS架构分为三层&#xff1a; 第一层是内核第二层是基础服务第三层是程序框架 。 鸿蒙OS底层三部分组成&#x…

《U型理论》速读

文章目录书籍信息概览踏上发现的旅程大火带来的启示踏上 U 型之旅学习和变革的4个层次组织的盲点社会的盲点科学的哲学基础关于界点下载观察感知自然流现结晶塑造原型运行社会场域理论的 21 个命题个人行动谈话行动自然流现的原则和实践&#xff1a;引领深刻的创新和变革视觉记…

Windows Server 2016搭建DNS服务

1&#xff1a;搭建DNS服务的目的是为了解析vCenter,当初安装时候没有用DNS解析&#xff0c;主机名是localhost无法安装vTPM虚拟Windows 11。 2&#xff1a;准备一台Windows Server 2016的主机&#xff0c;设置好固定IP地址,DNS就是本机的IP地址。 3&#xff1a;在服务器管理中…

Maven知识点-关于dependencyManagement和pluginManagement

前言 dependencyManagement和pluginManagement如何使用以及什么意思&#xff1f;我想懂点Maven的应该都明白&#xff0c;无非是依赖和插件的管理&#xff08;版本&#xff09;&#xff0c;一般多用于Maven项目的继承和聚合模式中。 这里不是讲解dependencyManagement和plugin…

PCB丝印的字符有哪些作用?

PCB字符也就是行业内常说的“丝印”PCB丝印在一般的PCB板子都可以看到&#xff0c;那么PCB丝印有那些作用呢。 1、大家都知道各种各样的电子元器件数不胜数&#xff0c;那么如何区分PCB这个焊盘是贴什么电子元器件的呢&#xff1f;实际上就是通过PCB板子上的丝印字符去判断每一…

package.json配置详解

npm 介绍 npm 是随同 Node.js 一起安装的包管理工具,能解决 Node.js 代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从 NPM 服务器下载别人编写的第三方包到本地使用;许用户从 NPM 服务器下载并安装别人编写的命令行程序到本地使用;允许用户将自己编写的包或命令行…

【云原生 | Docker 高级篇】11、Docker 私有镜像仓库 Harbor 安装及使用教程

目录 一、Harbor 介绍 二、Harbor 的优势 三、Harbor 部署安装 3.1 部署环境 3.2 为 Harbor 自签发证书 3.3 安装 Harbor 3.4 设置开机自启 四、Harbor 图像化界面使用说明 4.1 修改本地 hosts 文件 4.2 访问 harbor 4.3 创建项目 五、测试使用 harbor 私有镜像仓库…

form 表单只有一个input 时,回车自动提交表单造成页面刷新效果

现象&#xff1a;el-form 中仅有一个input&#xff0c;input上设置了回车响应事件&#xff0c;首次按回车键后&#xff0c;页面刷新&#xff0c;再次按回车才执行了响应事件 <el-form ref"form" submit.native.prevent><el-form-item><el-input keyu…

C#学习记录——【实例】C#实现OPC Client

最近学习测试用C#开发OPC客户端连接OPC服务器&#xff0c;防止遗忘&#xff0c;记录学习测试结果。 1、OPC基础知识 1.1、OPC概述 OPC是Object Linking and Embedding&#xff08;OLE&#xff09;for Process Control 的缩写&#xff0c;它是微软公司的对象链接和嵌入技术在…

【JavaEE】认识HTTP协议

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:认识HTTP协议、请求。 &#x1f680;&#x1f680;代码存放仓库github&#xff1a;JavaEE仓库&#xff01; ⛵⛵作者简介&#xff1…

Golang 提取视频中音频,存为MP3格式 | Golang工具

目录 前言 环境依赖 代码 总结 前言 本文提供将视频中音频提取出来存为mp3格式&#xff0c;一如既往的实用主义。 主要也是学习一下golang使用ffmpeg工具的方式。 环境依赖 ffmpeg环境安装&#xff0c;可以参考我的另一篇文章&#xff1a;windows ffmpeg安装部署_阿良的博…

Delphi复制HID、ID门禁卡源码

T5557卡是美国Atmel公司生产的多功能非接触式射频芯片卡&#xff0c;属于125KHz的低频卡&#xff0c;在国内有广大的应用市场&#xff0c;如很多酒店的门禁卡都是使用T5557卡。该芯片共有330bit(比特)的EPROM(分布为10个区块, 每个区块33bit)。0页的块0是被保留用于设置T5557操…

模电学习3. MCU接三极管开关电路简单分析

模电学习3. MCU接三极管开关电路简单分析一、说明二、使用NPN型三极管工作状态分析1. 饱和状态基本要求2. 计算限流电阻R23. IbI_bIb​4. 计算 RbR_bRb​5. 下拉电阻三、使用PNP型三极管工作状态分析1. 示例原理图2. IO输出低电平3. IO输出高电平一、说明 本文演示了一个使用M…