C++进阶-STL list容器的简单认识

STL list容器的简单认识

    • list容器基本概念
    • list容器构造函数
    • list容器赋值和交换
    • list容器大小操作
    • list容器插入和删除
    • list容器数据存取
    • list容器反转和排序
        • list排序案例

list容器基本概念

list容器是将数据进行链式存储的容器,链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的

链表的组成:链表由一系列节点组成

节点的组成:一个是存放数据元素的数据域,另一个是存储下一个结点地址的指针域

链表的优点:可以对任意位置进行快速的插入或删除元素
缺点:容器的遍历速度没有数组快,占用的空间比数组大

STL中的链表是一个双向循环链表

在这里插入图片描述
由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器

list的优点:

  • 采用动态存储分配,不会造成内存浪费和溢出
  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
    list的缺点:
  • 链表灵活,但是空间(指针域)和时间(遍历)额外耗费较大

list有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的

list容器构造函数

  • list<T> lit; 默认构造函数
list<int> lst;
  • list(beg, end); 构造函数将[beg, end)中的元素拷贝给本身
list<int> lst;
list<int> lst_2(lst.begin(), lst.end());
  • list(n, elem); 构造函数将n个elem拷贝给本身
list<int> lst(3, 12);
  • list(const list* list); 拷贝构造函数
list<int> lst;
list<int> lst_2(lst);

list容器赋值和交换

  • assign(beg, end); 将[beg, end)区间中的数据拷贝赋值给本身
list<int> lst;
list<int> lst2;
lst2.assign(lst.begin(), lst.end());
  • assign(n, elem); 将n个elem拷贝赋值给本身
list<int> lst2;
lst2.assign(3, 12);
  • list& operator=(const list& lst); 重载等号运算符
list<int> lst;
list<int> lst2;
lst2 = lst;
  • swap(lst); 将lst与本身的元素互换
list<int> lst;
lst.push_back(12);
lst.push_back(13);
list<int> lst2;
lst2.push_back(14);
lst2.push_back(15);
lst2.swap(lst);
for (list<int>::iterator it = lst.begin(); it != lst.end(); it++)
{
	std::cout << *it << " ";
}
std::cout << std::endl;
for (list<int>::iterator it = lst2.begin(); it != lst2.end(); it++)
{
	std::cout << *it << " ";
}

list容器大小操作

  • size(); 返回容器中元素的个数
lis.size();
  • empty(); 判断容器是否为空
lis.empty();
  • resize(num); 重新指定容器长度为num,容器变长,默认值填充之,容器变短,元素删除之
lis.resize(20);
  • resize(num, elem); 重新指定容器长度为num,容器变长,elem填充之,容器变短,元素删除之
lis.resize(20, 10);

list容器插入和删除

  • push_back(elem); 在容器尾部加入一个元素
list lst;
lst.push_back(12);
  • pop_back(); 删除容器尾部的一个元素
list lst;
lst.pop_back();
  • push_front(elem); 在容器头部插入一个元素
list lst;
lst.push_front(12);
  • pop_front(); 删除容器头部的一个元素
list lst;
lst.pop_front();
  • insert(pos, elem); 在pos位置插入elem元素的拷贝,返回新数据的位置
list lst;
lst.insert(lst.begin(), 100);
  • insert(pos, n, elem); 在pos位置插入n个elem元素的拷贝,无返回值
list lst;
lst.insert(lst.begin(), 10, 100);
  • insert(pos, beg, end); 在pos位置插入[beg, end)区间的数据,无返回值
list li;
list l2;
l2.insert(li.begin(), li.end());
  • clear(); 清空列表的数据
list ls;
ls.clear();
  • erase(beg, end); 删除[beg, end)区间的数据,返回下一个数据的位置
list ls;
ls.earse(ls.begin(), ls.end());
  • earse(pos); 删除pos位置的元素,返回下一个元素的位置
list ls;
ls.earse(ls.begin());
  • remove(elem); 删除容器中所有与elem元素匹配的元素
list ls;
ls.remove(12);

list容器数据存取

  • front(); 返回第一个元素
list<int> lst;
lst.push_back(10);
lst.push_back(20);
//返回第一个元素
std::cout << lst.front() << std::endl;
  • back(); 返回最后一个元素
list<int> lst;
lst.push_back(10);
lst.push_back(20);
std::cout << lst.back() << std::endl;

list容器反转和排序

  • reverse(); 反转链表
#include <iostream>
#include <list>
using namespace std;

void printf(const list<int>& lst)
{
	for (list<int>::const_iterator it = lst.begin(); it != lst.end(); it++)
	{
		std::cout << *it << " ";
	}
	std::cout << std::endl;
}

int main()
{
	list<int> lst;
	lst.push_back(10);
	lst.push_back(20);
	std::cout << "调用反转链表前:" << std::endl;
	printf(lst);
	lst.reverse();
	std::cout << "调用反转链表后:" << std::endl;
	printf(lst);
}

在这里插入图片描述

  • sort(); 链表排序
#include <iostream>
#include <list>
using namespace std;

void printf(const list<int>& lst)
{
	for (list<int>::const_iterator it = lst.begin(); it != lst.end(); it++)
	{
		std::cout << *it << " ";
	}
	std::cout << std::endl;
}

bool compare(int a, int b)
{
	//降序,第一个数大于第一个数
	return a > b;
}

int main()
{
	list<int> lst;
	lst.push_back(10);
	lst.push_back(30);
	lst.push_back(20);
	std::cout << "调用排序链表前:" << std::endl;
	printf(lst);
	lst.sort();
	std::cout << "调用排序链表后:" << std::endl;
	printf(lst);

	//使用自定义比较方法
	lst.sort(compare);

	std::cout << "调用自定义排序链表后:" << std::endl;
	printf(lst);
}

在这里插入图片描述

所有不支持随机访问迭代器的容器不能使用标准排序算法,这些容器会内置排序算法

list排序案例

定义一个Person类,包含姓名、年龄、身高三个属性,最终打印结果按照年龄进行升序,年龄一致则按照身高降序排列

#include <iostream>
#include <string>
#include <list>
#include <ctime>
using namespace std;

class Person
{
private:
	string m_Name;
	int m_Age;
	float m_Height;

public:
	Person(string name, int age, float height)
	{
		this->m_Age = age;
		this->m_Height = height;
		this->m_Name = name;
	}
	int getAge()
	{
		return this->m_Age;
	}
	float getHeight()
	{
		return this->m_Height;
	}
	//常函数内部不能修改属性值,除非属性添加关键字mutable
	void printf() const
	{
		std::cout << this->m_Name << " 的年龄:" << this->m_Age << " 身高:" << this->m_Height << std::endl;
	}
	static bool compare(Person& front, Person& next)
	{
		if (front.getAge() < next.getAge())
		{
			return true;
		}
		if (front.getAge() == next.getAge()) {
			return front.getHeight() >= next.getHeight();
		}
		return false;
	}
};

void printfAll(const list<Person>& lst)
{
	for (list<Person>::const_iterator it = lst.begin(); it != lst.end(); it++)
	{
		//常对象只能调用常函数
		it->printf();
	}
}

int main()
{
	//随机数种子
	srand((unsigned int)time(NULL));
	string name_Str[] = { "张三","李四","王二","麻子" };
	list<Person> person_list;
	for (int i = 0; i < sizeof(name_Str) / sizeof(name_Str[0]); i++)
	{
		Person person(name_Str[i], rand() % 60 + 40, rand() % 150 + 40);
		person_list.push_back(person);
	}
	std::cout << "调用排序前,初始化的信息为:" << std::endl;
	printfAll(person_list);
	std::cout << "调用排序后,排序后的信息为:" << std::endl;
	person_list.sort(Person::compare);
	printfAll(person_list);
}

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

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

相关文章

如何查看反汇编(VS)

如何查看反汇编 1. 设置断点2. 运行到该处3. 右键 反汇编结果 1. 设置断点 2. 运行到该处 3. 右键 反汇编 结果 即可跳转查看反汇编

【Linux】无废话教你如何用vs code连接云服务器

目录 1. 前言2. 云服务器准备3. 插件准备4. 连接云服务器5. 如何连接一台云服务器多个用户 1. 前言 本文章针对已经成功下载vs code的朋友&#xff0c;如若还未下载移步vscode官网 2. 云服务器准备 这里首先我们需要一台云服务器。云服务器选择有很多&#xff0c;阿里云、腾讯云…

Qt贝塞尔曲线

目录 引言核心代码基本表达绘制曲线使用QEasingCurve 完整代码 引言 贝塞尔曲线客户端开发中常见的过渡效果&#xff0c;如界面的淡入淡出、数值变化、颜色变化等等。为了能够更深的了解地理解贝塞尔曲线&#xff0c;本文通过Demo将贝塞尔曲线绘制出来&#xff0c;如下所示&am…

红黑树插入节点的模拟实现

要学习红黑树节点的插入那么首先就要了解什么是红黑树&#xff0c;以及红黑树的特点。 红黑树的特点 本来AVL树已经很厉害了&#xff0c;但是红黑树的总体效率略比1AVL树高。高的大体原因。我们先来看一下红黑树和AVL树的区别。 AVL树严格的保证了左子树和右子树的高度差不超…

计算机网络——b站王道考研笔记

第一章 计算机网络体系结构 1.计算机网络概述 &#xff08;1&#xff09;概念 计算机网络是一个将分散的&#xff0c;具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统&#xff1b; 是互连的&#…

kubernetes--pod详解

目录 一、pod简介&#xff1a; 1. Pod基础概念&#xff1a; 2. Kubrenetes集群中Pod的两种使用方式&#xff1a; 3. pod资源中包含的容器&#xff1a; 4. pause容器的两个核心功能&#xff1a; 5. Kubernetes中使用pause容器概念的用意&#xff1a; 二、pod的分类&#xff1a…

SharePoint 页面中插入自定义代码

我们都知道 SharePoint 是对页面进行编辑的。 对于一些有编程基础的人来说&#xff0c;可能需要对页面中插入代码&#xff0c;这样才能更好的对页面进行配置。 但是在新版本的 SharePoint modern 页面来说&#xff0c;虽然我们可以插入 Embed 组件。 但是 Embed 组件中是不允…

Linux系统上搭建高可用Kafka集群(使用自带的zookeeper)

本次在CentOS7.6上搭建Kafka集群 Apache Kafka 是一个高吞吐量的分布式消息系统&#xff0c;被广泛应用于大规模数据处理和实时数据管道中。本文将介绍在CentOS操作系统上搭建Kafka集群的过程&#xff0c;以便于构建可靠的消息处理平台。 文件分享&#xff08;KafkaUI、kafka…

Frp内网穿透部署

Frp内网穿透部署记录windows为例 A固定外网IP服务器一台&#xff08;可以映射端口&#xff09;B内网PC一台&#xff0c;可上外网 A固定外网IP服务器一台&#xff08;可以映射端口&#xff09; B内网PC一台&#xff0c;可上外网 GO语言&#xff1a;https://golang.org/doc/ins…

【算法专题】双指针—三数之和

力扣题目链接&#xff1a;三数之和 一、题目解析 二、算法原理 解法一&#xff1a;排序暴力枚举利用set去重 代码就不写了&#xff0c;你们可以试着写一下 解法二&#xff1a;排序双指针 这题和上一篇文章的两数字和方法类似 排序固定一个数a在这个数的后面区间&#xff0…

Spring Bean 的生命周期

一、前言&#xff1a; Spring Bean 的生命周期之前先来了解两个概念&#xff1a; 1.1 什么是 Bean In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is in…

“面向目标值的排列匹配“和“面向目标值的背包组合问题“的区别和leetcode例题详解

1 目标值排列匹配 1.1 从目标字符串的角度来看&#xff0c;LC139是一个排列问题&#xff0c;因为最终目标子串的各个字符的顺序是固定的&#xff1f; 当我们从目标字符串 s 的角度来看 LC139 “单词拆分” 问题&#xff0c;确实可以认为它涉及到排列的概念&#xff0c;但这种…

C++ Qt 学习(四):自定义控件与 qss 应用

1. qss 简介 Qt style sheet&#xff08;qss&#xff0c;Qt 样式表&#xff09;&#xff0c;不需要用 C 代码控件进行重载&#xff0c;就可以修改控件外观&#xff0c;类似于前端的 css 2. qss 选择器 2.1 通配符选择器 /* 设置后控件窗口背景色都被修改为黄色 */ * {backg…

便捷Benchmark.sh 自动匹配workload(自用)

​ 因为db_bench选项太多&#xff0c;而测试纬度很难做到统一&#xff08;可能一个memtable大小的配置都会导致测试出来的写性能相关的的数据差异很大&#xff09;&#xff0c;所以官方给出了一个benchmark.sh脚本用来对各个workload进行测试。 该脚本能够将db_bench测试结果中…

深度解析NLP定义、应用与PyTorch实战

1. 概述 文本摘要是自然语言处理&#xff08;NLP&#xff09;的一个重要分支&#xff0c;其核心目的是提取文本中的关键信息&#xff0c;生成简短、凝练的内容摘要。这不仅有助于用户快速获取信息&#xff0c;还能有效地组织和归纳大量的文本数据。 1.1 什么是文本摘要&#x…

《詩經别解》——國風·周南·雎鳩​​​​​​​

一、关于古文的一个认识 目前可以阅读的古文经典&#xff0c;大多是经历了几千年的传承。期间的武力战争、文化纷争、宗教侵袭、官僚介入及文人的私人恩怨与流派桎梏&#xff0c;印刷与制作技术&#xff0c;导致这些古文全部都已经面目全非。简单地说&#xff0c;你读到的都是…

树与二叉树作业

1. 已知一个二叉树的中序遍历序列和后序遍历序列&#xff0c;求这棵树的前序遍历序列 【问题描述】 已知一个二叉树的中序遍历序列和后序遍历序列&#xff0c;求这棵树的前序遍历序列。 【输入形式】 一个树的中序遍历序列 该树后序遍历序列&#xff0c;中间用空格分开。输…

el-table实现展开当前行时收起上一行的功能

<el-tableref"tableRef":data"tableData":expand-row-keys"expandRowKeys":row-key"handleRowKey" // 必须指定 row-keyexpand-change"handleExpandChange" // 当用户对某一行展开或者关闭的时候会触发该事件> <…

Creo螺旋扫描/弹簧画法

一&#xff1a;点击螺旋扫描 二&#xff1a;参考–》螺旋轮廓的定义&#xff1a; 三、草绘轮廓线&#xff1a;视图放正 四、草绘弹簧丝线形状&#xff1a; 在非中轴线上画圆&#xff1a; 制螺旋线&#xff1a; 首先理清Creo绘制螺旋线的逻辑&#xff08;不同于UG直接给定直径…

华为ensp:边缘端口并启动BUDU保护

如上图前提是三个交换机都做了rstp&#xff0c;则在边缘的地方做 边缘端口并启动BUDU保护&#xff0c;也就是我用绿色圈出来的地方 边缘1 进入交换机的系统视图 interface e0/0/3 进入接口 stp edged-port enable quit 再退回系统视图 stp bpdu-protection 这样就可以了…