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

news2025/1/10 11:44:35

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);
}

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

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

相关文章

Windows10 安装 Ubuntu(WSL2)

Windows10 安装 Ubuntu(WSL2)&#xff1a;因为 Ubuntu(WSL1) 不具备调试功能&#xff0c;所以尽可能安装 Ubuntu(WSL2)。 具体流程如下&#xff1a; 1. 什么是WSL Windows Subsystem for Linux&#xff08;简称WSL&#xff09;&#xff0c;Windows下的 Linux 子系统&#xff…

YOLO目标检测——猫狗目标检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;宠物识别、猫狗分类数据集说明&#xff1a;猫狗分类检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含有猫和狗图片标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xm…

幼教早教内容付费预约小程序的效果如何

很多家庭对孩子的重视程度很高&#xff0c;尤其加之如今激烈竞争的市场&#xff0c;孩子从小便需要各种提前教育&#xff0c;而相关教培企业也比较多&#xff0c;基于服务高需求度&#xff0c;线下教育与线上课程教育同样重要。 在实际经营中&#xff0c;幼教早教培训机构也面…

[云原生案例2.4 ] Kubernetes的部署安装 【通过Kubeadm部署Kubernetes高可用集群】

文章目录 1. 基本架构及前置准备1.1 基本架构1.2 前置准备 2. 系统初始化操作 ---- 所有节点2.1 关闭防火墙、selinux和swap分区2.1.1 关闭防火墙和selinux2.1.2 关闭交换分区 2.2 修改主机名&#xff0c;添加域名映射2.2.1 修改主机名2.2.2 修改本地hosts文件 2.3 内核升级2.4…

[html] 动态炫彩渐变背景

废话不多说&#xff0c;直接上源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>ZXW-NUDT: 动态炫…

[量化投资-学习笔记012]Python+TDengine从零开始搭建量化分析平台-策略回测

上一章节《MACD金死叉策略回测》中&#xff0c;对平安银行这只股票&#xff0c;按照金死叉策略进行了回测。 但通常我们的股票池中有许多股票&#xff0c;每完成一个交易策略都需要对整个股票池进行回测。 下面使用简单的轮询&#xff0c;对整个股票池进行回测。 # 计算单只…

Clickhouse学习笔记(10)—— 查询优化

单表查询 Prewhere 替代 where prewhere与where相比&#xff0c;在过滤数据的时候会首先读取指定的列数据&#xff0c;来判断数据过滤&#xff0c;等待数据过滤之后再读取 select 声明的列字段来补全其余属性 简单来说就是先过滤再查询&#xff0c;而where过滤是先查询出对应…

web前端开发第一次Dreamweave课堂练习/html练习代码《社会主义核心价值观》

目标图片&#xff1a; 文字素材&#xff1a; 社会主义核心价值观 Socialist Core Values 富强、民主、文明、和谐是国家层面的价值目标。 自由、平等、公正、法治是社会层面的价值取向。 爱国、敬业、诚信、友善是公民个人层面的价值准则。 Core socialist values are the…

Golang 中的 Context 包

简介 今天&#xff0c;我们将讨论 Go 编程中非常重要的一个主题&#xff1a;context 包。如果你现在觉得它很令人困惑&#xff0c;不用担心 — 在本文结束时&#xff0c;你将像专家一样处理 context&#xff01; 想象一下&#xff0c;你在一个主题公园&#xff0c;兴奋地准备…

CUMT-----Java课后第六章编程作业

文章目录 一、题11.1 问题描述1.2 代码块1.3 运行截图 二、题22.1 问题描述2.2 代码块2.3 运行截图 一、题1 1.1 问题描述 (1)创建一个用于数学运算接口&#xff0c;算数运算加、减、乘和除都继承该接口并实现具体的算数运算。(2)编写一个测试类进行运行测试。 1.2 代码块 p…

【操作系统面试题(32道)与面试Linux命令大全】

文章目录 操作系统面试题引论1.什么是操作系统&#xff1f;2.操作系统主要有哪些功能&#xff1f; 操作系统结构3.什么是内核&#xff1f;4.什么是用户态和内核态&#xff1f;5.用户态和内核态是如何切换的&#xff1f; 进程和线程6.并行和并发有什么区别&#xff1f;7.什么是进…

大力说运营:如何战胜每日的头疼难题?

小美是一名微信公众号运营专员&#xff0c;近几个月来&#xff0c;每当想到去上班&#xff0c;她就感到全身无力&#xff0c;焦虑烦躁。 原来老板要求小美每天都发一篇推文&#xff0c;而且选题要有吸引力&#xff0c;经过这几个月的苦肝&#xff0c;小美感觉身体被掏空&#x…

全域旅游“一机游”智慧旅游平台解决方案:PPT全文48页,附下载

关键词&#xff1a;智慧文旅解决方案&#xff0c;智慧旅游解决方案&#xff0c;智慧旅游平台建设方案&#xff0c;智慧文旅综合运营平台&#xff0c;智慧文旅建设方案 一、智慧文旅一机游定义 智慧文旅一机游是一种新型的旅游方式&#xff0c;它通过智能化的设备和系统&#…

企业培训服务预约小程序的作用是什么

企业在经营过程中往往会遇到人才培养进展缓慢、客户难以寻找维系、经营缺乏管理等痛点&#xff0c;基于此&#xff0c;相关企业培训机构或个人有着较高需求&#xff0c;但也同样面临着一些难题。 缺少转化方式&#xff0c;无法促进用户购买或预约咨询服务&#xff0c;向外扩展…

c++ 信奥编程 1135:配对碱基链

#include<iostream> #include<cstdio> #include<cstring> using namespace std; int main(){char a[256];int len;int i;gets(a);lenstrlen(a);//计算字符串长度for(i0; i<len; i){ //输出配对碱基if(a[i]A) cout<<"T";if(a[i]T) cout<…

Java实现音频转码,WAV、MP3、AMR互转

1.背景 最近在集成一款产品支持语音双向对讲&#xff0c;首先是采集小程序的音频下发给设备端&#xff0c;然后可以控制设备录音生成音频链路让小程序播放。在这个过程中发现&#xff0c;设备除了AMR格式的音频外&#xff0c;其他的音频都不支持&#xff0c;而微信小程序有不支…

C++进阶-STL set/multiset容器和map容器的简单认识

set/multiset容器的简单认识 set基本概念set与multiset 的区别&#xff1a;set容器的构造和赋值set容器的大小和交换set容器的插入与删除set容器的查找和统计set容器-set和multiset的区别set容器内置类型指定排序规则set容器自定义数据类型指定排序规则 pair对组创建map容器的基…

“富婆”通讯录——让你少奋斗50年

文章目录 一、项目需求分析二、通讯录各功能实现思路及代码准备工作2.1、打印一个菜单&#xff0c;提供用户选择功能2.2、添加联系人信息2.3、删除联系人信息2.4、查询联系人信息2.5、修改联系人信息2.6、显示所有联系人信息2.7、对所有联系人信息进行排序整理2.8、删除所有联系…

AI小镇Generative Agents: Interactive Simulacra of Human Behavior

文章目录 1 Introduction2 Related Works2.1 Human-AI Interaction2.2 Belivable Proxies for Human Behavior2.3 Large Language Model and Human Behavior 3 Generative agent behavior and interaction&#xff08;行为与交互&#xff09;3.1 Agent Avatar and Communicatio…