【C++】---STL之list详解

news2024/12/23 7:19:46

【C++】---STL之list详解

  • 一、了解list的基本信息
  • 二、成员函数
    • 1、构造
    • 2、迭代器
    • 3、empty()
    • 4、size()
    • 5、front()
    • 6、back()
    • 7、push_front()
    • 8、pop_front()
    • 9、push_back()
    • 10、pop_back()
    • 11、insert()
    • 12、erase()
    • 13、swap()
    • 14、sort()
    • 15、reverse()

一、了解list的基本信息

1、库里面的list是一个带头双向循环链表结构!

2、优点:可以在任意位置进行插入删除,插入删除的效率比较高。

3、缺点:不支持任意位置的随机访问(因为物理空间不连续!)

二、成员函数

1、构造

在这里插入图片描述

explicit list (const allocator_type& alloc = allocator_type());	//构造空list
 
explicit list (size_type n, const value_type& val = value_type(),//构造一个有n个元素值为val的list
                const allocator_type& alloc = allocator_type());
 
template <class InputIterator>//构造一个list,值为InputIterator的first到last之间的元素
  list (InputIterator first, InputIterator last,
         const allocator_type& alloc = allocator_type());

2、迭代器

在这里插入图片描述
在这里插入图片描述

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

int main()
{
	list<int> lt1;


	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);

	list<int>::iterator it = lt1.begin();
	while (it != lt1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

3、empty()

在这里插入图片描述
在这里插入图片描述

4、size()

在这里插入图片描述

int main()
{
	list<int> lt1;


	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);

	//list<int>::iterator it = lt1.begin();
	//while (it != lt1.end())
	//{
	//	cout << *it << " ";
	//	it++;
	//}
	//cout << endl;

	//cout << lt1.empty() << endl;

	cout << lt1.size()<<endl;

	return 0;
}

在这里插入图片描述

5、front()

在这里插入图片描述

int main()
{
	list<int> lt1;


	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);

	cout << lt1.front() << endl;

	return 0;
}

在这里插入图片描述

6、back()

在这里插入图片描述

int main()
{
	list<int> lt1;


	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);

	//cout << lt1.front() << endl;
	cout << lt1.back() << endl;
	return 0;
}

在这里插入图片描述

7、push_front()

在这里插入图片描述

int main()
{
	list<int> lt1;

	lt1.push_front(1);
	lt1.push_front(2);
	lt1.push_front(3);
	lt1.push_front(4);
	lt1.push_front(5);
	
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

在这里插入图片描述

8、pop_front()

在这里插入图片描述

int main()
{
	list<int> lt1;

	lt1.push_front(1);
	lt1.push_front(2);
	lt1.push_front(3);
	lt1.push_front(4);
	lt1.push_front(5);
	
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	lt1.pop_front();
	lt1.pop_front();
	lt1.pop_front();

	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

在这里插入图片描述

9、push_back()

在这里插入图片描述

int main()
{
	list<int> lt1;

	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);

	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

在这里插入图片描述

10、pop_back()

在这里插入图片描述

int main()
{
	list<int> lt1;

	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);

	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	lt1.pop_back();
	lt1.pop_back();
	lt1.pop_back();

	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

11、insert()

在这里插入图片描述

int main()
{
	list<int> lt1;

	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);

	list<int>::iterator pos = find(lt1.begin(), lt1.end(), 2);//在链表中查找值为2的元素,并返回它的迭代器

	lt1.insert(pos, 100);// 在pos位置之前插入100

	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

12、erase()

在这里插入图片描述

改变底层的数据结构,迭代器失效:

int main()
{
	list<int> lt1;

	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);

	list<int>::iterator pos = find(lt1.begin(), lt1.end(), 3);// 擦除元素值为3的

	lt1.erase(pos);

	cout << *pos << endl;// pos的位置的元素的值已经被删除了。
	//此时如果不对pos的位置的迭代器进行重新赋值更新,那么pos就是一个野指针,非法访问。

	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述
erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代 器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是 没有元素的,那么pos就失效了。因此删除list中任意位置上元素时,vs就认为该位置迭代器失效 了。

13、swap()

在这里插入图片描述

int main()
{
	list<int> lt1;

	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);

	list<int> lt2;

	lt2.push_back(1);
	lt2.push_back(1);
	lt2.push_back(1);
	lt2.push_back(1);
	lt2.push_back(1);

	cout << "lt1交换前:";
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;


	lt1.swap(lt2);// lt1 和 lt2内容进行交换

	cout << "lt1交换后:";
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

在这里插入图片描述

14、sort()

在这里插入图片描述
sort()函数默认是:排升序!

int main()
{
	list<int> lt1;

	lt1.push_back(4);
	lt1.push_back(3);
	lt1.push_back(5);
	lt1.push_back(1);
	lt1.push_back(2);


	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	lt1.sort();

	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	return 0;
}

在这里插入图片描述

15、reverse()

在这里插入图片描述

int main()
{
	list<int> lt1;

	lt1.push_back(4);
	lt1.push_back(3);
	lt1.push_back(5);
	lt1.push_back(1);
	lt1.push_back(2);


	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	lt1.sort();

	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	lt1.reverse();

	for (auto e : lt1)
	{
		cout << e << " ";
	}
	return 0;
}

在这里插入图片描述


好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!
在这里插入图片描述

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

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

相关文章

各平台奇怪问题备忘录

微信小程序 小程序报错Page 页面路径 has not been register yet 描述&#xff1a;uniapp做微信小程序开发时&#xff0c;新增某页面后&#xff0c;小程序跳转该页面报错Page 页面路径 has not been register yet 已知&#xff1a;page.json已添加该页面&#xff0c;小程序a…

如何优雅地Spring事务编程

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 在开发中&#xff0c;有时候我们需要对 Spring 事务的生命周期进行监控&#xff0c;比如在事务提交、回滚或挂起时触发特定的逻辑处理。那么如何实现这种定制化操作呢&am…

[Meachines][Medium]IClean

Main $ nmap -p- -sC -sV 10.10.11.12 -Pn --min-rate 1000 $ echo "10.10.11.12 capiclean.htb">>/etc/hosts 这题可能和python的SSTI有关 $ gobuster dir --url "http://capiclean.htb" --wordlist /usr/share/seclists/Discovery/Web-Content/c…

ENVI操作:GF2影像全色与多光谱融合

1、插件下载安装 1.1、插件下载 ENVI 处理 GF2影像需利用特定的 App 插件进行处理&#xff1b;进入下述官方网站&#xff0c;点击 下载 即可&#xff1b;仅支持 ENVI 5.3.1 以上版本的软件&#xff1b; 下载地址&#xff1a;https://envi.geoscene.cn/appstore/ 1.2、属性设…

VS2022配置和搭建QT

一、下载QT 可以去QT官网下载:https://www.qt.io/product/development-tools。 直接安装。 二、安装qt插件 直接在vs插件市场搜索就行。 安装的时候根据提示&#xff0c;关闭vs自动安装 再次进去vs提示你选择qt版本&#xff0c;psth里边找到安装版本的qmake.exe就行 配…

11.盛最多水的容器 C++

一开始我最先想到的是暴力解法&#xff0c;就是两个循环嵌套依次遍历&#xff0c;所有情况都过一遍找出最大值&#xff0c;这样示例的结果虽然是正确的&#xff0c;但是超时。所以暴力解法行不通&#xff0c;双指针思考才是正道&#xff0c;双指针一般都是一边一个&#xff0c;…

裸金属服务器是什么

自推出裸金属服务器以来&#xff0c;它一直断断续续地出现在我们面前。最近&#xff0c;关于裸金属服务器、什么是裸金属服务器、裸金属服务器可以做什么、数据托架共享的讨论越来越多&#xff1a; 裸金属服务器&#xff08;bare metal server&#xff0c;BMS&#xff09;的官…

数据库——实 验 8 SQL 编程

1.T-SQL 语言简介 SQL Server 使用的语言称作 Transact-SQL, 它不仅包括基本 SQL 操作的内容&#xff0c;如 SQL 的数据查询功能和数据操作功能等&#xff0c;还有一般程序设计的能力。 2. 局部变量和全局变量的概念 1)局部变量 局部变量是一个能够拥有特定数据类型的对…

掌握Linux Shell脚本函数:提高脚本效率与可维护性

目录标题 1、什么是Shell函数&#xff1f;2、如何定义Shell函数&#xff1f;3、Shell函数参数4、返回值5、实例&#xff1a;使用函数进行文件备份6、为什么使用函数&#xff1f;7、最佳实践 在编写Linux shell脚本时&#xff0c;函数是组织和重用代码的重要手段。本文将介绍如何…

python getsize如何使用

第一步&#xff0c;点击键盘 winr&#xff0c;打开运行窗口&#xff1b;在窗口中输入“cmd"&#xff0c;点击确定&#xff0c;打开windows命令行窗口。 第二步&#xff0c;在windows命令行窗口中&#xff0c;输入“python”&#xff0c;进入python交互窗口。 第三步&#…

C++ —— 继承

什么是继承&#xff1f; 继承是指一种代码可以被复用的机制&#xff0c;在一个类的基础上进行扩展&#xff0c;产生的新类叫做派生类&#xff0c;被继承的类叫基类。&#xff08;也可称为子类和父类&#xff09; 继承的写法&#xff1a; class B : 继承方式 A (…

Laravel 6 - 第十三章 请求

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

SpringBoot引入第三方jar包或本地jar包

idea2018创建spring boot项目 New Project窗口选择Spring Initializr Type选择Maven(Generate…),有两个Maven选择这一个。 勾选Spring Web。 pom.xml中version改成2.5.10。 在resources中新建jar目录&#xff0c;将第三方jar包fastjson2-2.0.47.jar放入其中。&#xff08…

【C++】日期计算机

个人主页&#xff1a;救赎小恶魔 欢迎大家来到小恶魔频道 好久不见&#xff0c;甚是想念 今天我们要讲述的是一个日期类计算机的代码实现 引言&#xff1a; 我们日常生活中可能会有一个烦恼。 今天几月几号&#xff1f;过n天后又是几月几号&#xff1f;某年某月某天和x年…

Python读写文本URL蓝牙WIFI自动连接电子名片位置坐标智能海报等NDEF标签

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?id615391857885&spma1z10.5-c.w4002-21818769070.11.60ad789erlonvk 近场通信&#xff08;Near Field Communication&#xff0c;简称NFC&#xff09;&#xff0c;是一种新兴的技术&…

实验:使用apache + yum实现自制yum仓库

实验准备 Web服务器端&#xff1a;cenos-1&#xff08;IP&#xff1a;10.9.25.33&#xff09; 客户端&#xff1a;centos-2 保证两台机器网络畅通&#xff0c;原yum仓库可用&#xff0c;关闭防火墙和selinux Web服务器端 ①安装httpd并运行&#xff0c;设置开机自启动 安装…

【人工智能基础】人工神经网络

一、人工神经网络的三要素 人工神经元数理模型 MP模型是世界上第一个神经计算模型&#xff0c;为神经网络理论提供了基础 MP模型功能 对树突输入u的线性加权求和对净输入的非线性转换\ 作用函数的功能作用函数的功能 MP神经元模型的作用函数是单位阶跃函数。当x≥0时f(x)…

实现Node.js安装与配置。

一 、Node.js简介 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;用于构建高性能、可扩展的网络应用程序。它发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;允许使用JavaScript进行服务器端编程&#xff0c;使开发者能够在前后端都使用同一种编程…

ASP.NET教务平台—学籍管理模块开发与设计

摘 要 教务平台之学籍管理模块是一个典型的教务信息管理系统(MIS)&#xff0c;其开发主要包括后台数据库的建立和前端应用程序的开发两个方面。对于后台数据库要求实现数据的完整性、一致性和安全性&#xff1b;对于前台应用程序开发则要求模块功能完备、界面友好、易使用等特…

进程状态和优先级(进程第2篇)【Linux复习篇】

目录 一、进程状态 1、进程有什么状态&#xff1f; 2、 Linux下的进程状态有什么&#xff1f; 二、进程优先级 1、进程优先级是什么&#xff1f; 2、为什么要有优先级 3、怎么改进程优先级&#xff1f;要改吗&#xff1f; 4、操作系统如何根据优先级开展调度的&#xff…