C++初阶 List的介绍和使用

news2025/2/27 5:28:41

作者:@小萌新
专栏:@初阶C++
作者简介:大二学生 希望能和大家一起进步
博客简介:本篇博客会简单介绍List和它的用法
在这里插入图片描述

List的介绍和使用

  • List介绍
  • List的使用方式
    • List的定义方式
    • List的插入与删除
      • push_front pop_front
      • push_back pop_back
      • insert
      • earse
    • 迭代器的使用
      • begin end
      • rbegin rend
    • list的元素获取
      • front和back
    • list容量相关
      • size
      • resize
      • empty和clear
    • list的操作函数
      • sort
      • splice
      • remove
      • remove_if
      • unique
      • merge
      • reverse
      • assgin
      • swap
  • 总结

List介绍

  1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

什么意思呢? 看上去和我们以前的双链表结构十分相似是吧

  1. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。

这个不必多说 数据结构初阶的内容

  1. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高
    效。

  2. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

这个其实就是双链表的优点了

  1. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素

双链表的缺点

List的使用方式

List的定义方式

方式一:构造一个某类型的空容器

list<int> lt1; //构造int类型的空容器

在这里插入图片描述

方式二:构造一个由n个val值的

list<int> lt2(10, 2); //构造含有10个2的int类型容器

在这里插入图片描述

方式三 拷贝构造其他容器的复制品

	list<int> lt3(lt2);

在这里插入图片描述
方式四: 使用迭代器拷贝某一段内容

	string s1 = "hello world";
	list<char> lt4(s1.begin(), s1.end());

在这里插入图片描述
方式五:构造数组某段区间的复制品

	int arr[5] = { 1,2,3,4,5 };
	list<int> lt5(arr, arr + 5);

在这里插入图片描述

总结 上面的四种方式和vector的构造一模一样
要注意的只有最后一点 List可以用数组初始化

List的插入与删除

push_front pop_front

代码不表示如下

void test2()
{
	list<int> lt1;
	lt1.push_front(1);
	lt1.push_front(2);
	lt1.push_front(3);
	lt1.push_front(4);
	lt1.push_front(5);
	lt1.push_front(6);
	for (auto x : lt1)
	{
		cout << x << " ";
	}
	lt1.pop_front();
	lt1.pop_front();
	lt1.pop_front();
	cout << endl;
	for (auto x : lt1)
	{
		cout << x << " ";
	}
}

演示效果如下
在这里插入图片描述
我们可以很清楚的知道确实是头插头删

push_back pop_back

代码演示如下

void test3()
{
	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);
	lt1.push_back(6);
	for (auto x : lt1)
	{
		cout << x << " ";
	}
	lt1.pop_back();
	lt1.pop_back();
	lt1.pop_back();
	cout << endl;
	for (auto x : lt1)
	{
		cout << x << " ";
	}
}

显示效果如下

在这里插入图片描述

insert

insert插入支持三种方式

方式一:在指定的迭代器位置插入一个值

代码表示如下

	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);
	lt1.push_back(6);
	lt1.insert(lt1.end(), 100);
	for (auto x : lt1)
	{
		cout << x << " ";
	}

在这里插入图片描述
方式二: 在指定迭代器位置插入n个val值

代码表示如下

	lt1.insert(lt1.begin(), 5,101);
	for (auto x : lt1)
	{
		cout << x << " ";
	}
	cout << endl;

显示效果如下

在这里插入图片描述
方式三: 在指定迭代器位置插入一段迭代器(左闭右开)

代码表示如下

	lt1.insert(lt1.begin(), lt1.begin(), lt1.end());
	for (auto x : lt1)
	{
		cout << x << " ";
	}
	cout << endl;
}

演示效果如下

在这里插入图片描述

earse

earse支持两种删除方式

方式一. 删除指定迭代器的位置

	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);
	lt1.push_back(6);
	lt1.erase(lt1.begin());
	for (auto x : lt1)
	{
		cout << x << " ";
	}
	cout << endl;

演示效果如下

在这里插入图片描述
方式二: 删除某个迭代器区间 (左闭右开)

代码表示如下

	lt1.erase(++lt1.begin() , lt1.end());
	for (auto x : lt1)
	{
		cout << x << " ";
	}
	cout << endl;

演示效果如下

在这里插入图片描述

迭代器的使用

begin end

这里直接使用迭代器遍历数组的方式带大家再了解下迭代器的使用

代码和演示效果如下

	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);
	lt1.push_back(6);
	list<int>::iterator it = lt1.begin();
	while (it!=lt1.end())
	{
		cout << *it << " ";
		it++;
	}

在这里插入图片描述

rbegin rend

代码和显示效果如下

	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);
	lt1.push_back(6);
	list<int>::reverse_iterator it = lt1.rbegin();
	while (it != lt1.rend())
	{
		cout << *it << " ";
		it++;
	}

在这里插入图片描述

list的元素获取

front和back

front函数用于获取list容器当中的第一个元素,back函数用于获取list容器当中的最后一个元素。

代码表示如下

void test8()
{
	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);
	lt1.push_back(6);
	cout << lt1.front() << " " << lt1.back();
}

显示效果如下

在这里插入图片描述

list容量相关

size

size可以获取容量的大小

代码和演示效果如下

	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);
	lt1.push_back(6);
	cout << lt1.size() << " ";

在这里插入图片描述

resize

reszie有两个参数 一个是你要重新赋值的大小 一个是你要重新赋的默认值

使用规则如下

  1. 如果要被重新赋的值小于本来的大小 那么就将size缩小到该值
  2. 如果要被重新赋的值大于本来的大小 那么就将size扩大到该值 并且后面赋我们给的默认值参数

代码和显示效果如下

	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);
	lt1.push_back(6);
	lt1.resize(3,9);
	for (auto x : lt1)
	{
		cout << x << " ";
	}
	cout << endl;
	lt1.resize(9, 9);
	for (auto x : lt1)
	{
		cout << x << " ";
	}
	cout << endl;

在这里插入图片描述

empty和clear

这两个放在一起刚好可以验证

clear清空list

empty判断是否为空

代码和效果图如下

	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);
	lt1.push_back(6);
	cout << lt1.empty()<< endl;
	lt1.clear();
	cout << lt1.empty() << endl;

在这里插入图片描述

list的操作函数

sort

顾名思义 排序(顺序)

代码和演示效果如下

void test11()
{
	list<int> lt1;
	lt1.push_back(5);
	lt1.push_back(1);
	lt1.push_back(6);
	lt1.push_back(12);
	lt1.push_back(576);
	lt1.push_back(3);
	lt1.push_back(54);
	for (auto x : lt1)
	{
		cout << x << " ";
	}
	cout << endl;
	lt1.sort();
	for (auto x : lt1)
	{
		cout << x << " ";
	}
	cout << endl;
}

在这里插入图片描述

splice

splice的使用方式有三种

方式一 将一个list拼接到另一个list的指定迭代器位置

代码和演示效果如下

	list<int> lt1;
	list<int> lt2(10,5);
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);
	lt1.push_back(6);

	lt1.splice(lt1.begin(), lt2);
	for (auto x : lt1)
	{
		cout << x << " ";
	}
	cout << endl;

在这里插入图片描述
方式二 将容器当中的某一个数据拼接到另一个容器的指定迭代器位置。

代码和显示效果如下

在这里插入图片描述

方式三: 将容器指定迭代器区间的数据拼接到另一个容器的指定迭代器位置。

void test12()
{
	list<int> lt1;
	list<int> lt2(10,5);
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);
	lt1.push_back(6);

	//lt1.splice(lt1.begin(), lt2);
	//lt1.splice(lt1.begin(), lt2, lt2.begin()); // 将lt2中的插入到lt1的头 
	lt1.splice(lt1.begin(),lt2, lt2.begin(), lt2.end()); // 将lt2中的头到尾插入到lt1的头
	for (auto x : lt1)
	{
		cout << x << " ";
	}

	cout << endl;

}

在这里插入图片描述

remove

参数只有一个 给定一个值 删除list中所有这个值

代码和演示效果如下

	list<int> lt1;
	list<int> lt2(10,5);
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);
	lt1.push_back(6);

	//lt1.splice(lt1.begin(), lt2);
	//lt1.splice(lt1.begin(), lt2, lt2.begin()); // 将lt2中的插入到lt1的头 
	lt1.splice(lt1.begin(),lt2, lt2.begin(), lt2.end()); // 将lt2中的头到尾插入到lt1的头
	for (auto x : lt1)
	{
		cout << x << " ";
	}
	cout << endl;
	lt1.remove(5);
	for (auto x : lt1)
	{
		cout << x << " ";
	}
	cout << endl;

在这里插入图片描述

remove_if

给定一个条件 如果符合条件就删除

代码表示如下

bool single_digit(const int& val)
{
	return val < 10;
}

void test12()
{


	list<int> lt;
	lt.push_back(10);
	lt.push_back(4);
	lt.push_back(7);
	lt.push_back(18);
	lt.push_back(2);
	lt.push_back(5);
	lt.push_back(9);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl; //10 4 7 18 2 5 9
	lt.remove_if(single_digit); //删除容器当中值小于10的元素
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl; //10 18
}

显示效果如下

在这里插入图片描述

unique

去除连续的重复值

代码和演示效果如下

void test12()
{


	list<int> lt;
	lt.push_back(10);
	lt.push_back(4);
	lt.push_back(4);
	lt.push_back(7);
	lt.push_back(18);
	lt.push_back(4);
	lt.push_back(2);
	lt.push_back(2);
	lt.push_back(2);
	lt.push_back(2);
	lt.push_back(5);
	lt.push_back(2);
	lt.push_back(9);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl; 
	lt.unique();
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

在这里插入图片描述
注意了 我们这里并不是真正的去重

只是删除连续的重复值而已

要是我们想真正的去重怎么办呢? 排序!

演示效果如下
在这里插入图片描述

merge

归并并且排序

使得两个list合并到一个当中 并且它们有序

注意!!!!!!

一定要提前对两个list排序!!!
一定要提前对两个list排序!!!
一定要提前对两个list排序!!!

不然会报错的

代码表示如下

void test12()
{


	list<int> lt;
	lt.push_back(10);
	lt.push_back(4);
	lt.push_back(4);
	lt.push_back(7);
	lt.push_back(18);
	lt.push_back(4);
	lt.push_back(2);
	lt.push_back(2);

	list<int> lt1;
	lt1.push_back(5);
	lt1.push_back(1);
	lt1.push_back(6);
	lt1.push_back(12);
	lt1.push_back(576);
	lt1.push_back(3);
	lt1.push_back(54);
	lt.sort();
	lt1.sort();
	lt.merge(lt1);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

在这里插入图片描述

reverse

很简单了 逆序

我们直接上代码和效果图

void test13()
{
	list<int> lt1;
	lt1.push_back(5);
	lt1.push_back(1);
	lt1.push_back(6);
	lt1.push_back(12);
	lt1.push_back(576);
	lt1.push_back(3);
	lt1.push_back(54);
	lt1.sort();
	lt1.reverse();
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;


}

在这里插入图片描述

assgin

这个函数也有两个用法

方式一: 重新赋予 n 个 val值

代码表示如下

	list<char> lt(3, 'a');
	lt.assign(3, 'b'); //将新内容分配给容器,替换其当前内容
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl; //b b b

在这里插入图片描述

方式二: 使用两个迭代器赋值

代码和显示效果图如下

	list<char> lt(3, 'a');
	string s1("hello world");
	lt.assign(s1.begin(), s1.end());
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl; 

在这里插入图片描述

swap

swap 交换两个list容器的内容

代码和显示效果图如下


void test16()
{
	list<char> lt(10,'a');
	list<char> lt1(10, 'b');
	lt.swap(lt1);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

在这里插入图片描述

总结

在这里插入图片描述

本文主要讲解了list的使用
对比于vector来说list多了一些函数内容 相差不大
由于作者水平有限 错误在所难免 希望大佬看到能够及时指正
如果本篇博客帮助到了你 别忘记一键三连啊
阿尼亚 哇酷哇酷!!!

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

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

相关文章

虚拟机磁盘扩容(纯命令行)

背景&#xff1a;磁盘使用率达到100%&#xff0c;无大数据文件可删除&#xff0c;需要进行磁盘扩容 步骤&#xff1a; 1.虚拟机调高分配给磁盘的大小 2.启动虚拟机&#xff0c;查看磁盘是否扩容 fdisk -l 3.扩容磁盘分区 fdisk /dev/sda 先输入p查看当前情况 输入d&#xf…

Flash、eeprom、rom、ram

存储器 ramrom rom: 不能编程prom: 可以写入一次eprom: 多次擦写, 需要在紫外线照一下eeprom: 任意修改 狭义EEPROM:广义EEPROM: flash nor flash: 字节读, 块擦除nand flash: 页读取, 块擦除 ROM&RAM EEPROM 可随机访问/修改任意字节, 可向每个bit写入0/1, 掉电不丢…

【附源码】计算机毕业设计JAVA传统文化知识竞赛系统

【附源码】计算机毕业设计JAVA传统文化知识竞赛系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA…

推荐一本计算机领域可以发的2区计算机智能医疗类SCI

本期小编给大家推荐的是我处新增的一本TECH SCIENCE PRESS旗下2区智能医疗类SCI. 这本期刊是一本经同行评审的开放获取期刊&#xff0c;出版计算机网络、人工智能、大数据、软件工程、多媒体、网络安全、物联网、材料基因组、集成材料科学以及数据分析、建模、现代功能和多功…

同花顺_代码解析_五彩K线

本文通过对同花顺自带的五彩K线进行解析&#xff0c;用以了解同花顺相关策略设计的思想。 目录 早晨之星 黄昏之星 十字星 长十字星 垂死丁字 射击之星 穿头破脚 红三兵 三只乌鸦 光头阳线 红绿灯 早晨之星 行号 1 a1 -> K线实体长度是开盘价的0.5%以下&…

MAX25————用vray还原模型在Substance Painter的光照以及材质效果

现在很多小伙伴喜欢在Substance Painter&#xff08;俗称SP&#xff09;里面做贴图。但是经常很苦恼&#xff0c;sp里做出的效果&#xff0c;导出来&#xff0c;放到unity或者max里面再渲染&#xff0c;光照跟材质效果就都变了。其实很简单&#xff0c;做到以下几点。就可以还原…

我的有趣的英语学习经历

文 / 谷雨&#xff08;微信公众号&#xff1a;王不留&#xff09; 我是一个社牛&#xff0c;大大咧咧&#xff0c;与人交往&#xff0c;不会瞻前顾后。 上半年&#xff0c;大四即将毕业&#xff0c;我闲来无事&#xff0c;突然脑袋发热&#xff0c;想找原版《经济学人》翻翻。于…

第十一届蓝桥杯国赛C++B组题解(A - J)

第十一届蓝桥杯国赛CB组 美丽的2 题目地址&#xff1a;https://www.lanqiao.cn/problems/1018/learning/ 难度&#xff1a;简单 知识点&#xff1a; 模拟枚举 【题目描述】 ​ 1−20201-20201−2020 中有多少个数中含有数字2 【解题思路】 范围很小&#xff0c;直接暴力判断…

c盘垃圾太多怎么清理?c盘垃圾太多需要重装系统嘛?

一台电脑为了方便大家平时使用过程中存储各种文件&#xff0c;会为用户们规划多个不同的磁盘&#xff0c;当然这些磁盘大家也可以使用一些工具来自己设置&#xff0c;其中最为重要的就是C盘了&#xff0c;作为系统磁盘C盘里面会存储大量的文件&#xff0c;这些文件并不是系统必…

思必驰周强:AI 和传统信号技术在实时音频通话中的应用

如何用 AI 解决声音传输&处理中的三大问题&#xff1f;三大问题又是哪三大问题&#xff1f; 在「RTE2022 实时互联网大会」中&#xff0c;思必驰研发总监 周强以《AI 和传统信号技术在实时音频通话中的应用》为题进行了主题演讲。 本文内容基于演讲内容进行整理&#xff0…

MySql表的基本增删改查详解

目录创建表create表中--插入数据--“增”单行&#xff0c;全列插入多行插入插入重复则-更新插入重复则-替换插入查询结果表中--检索数据--“查”全列查询指定列查询查询字段为表达式给查询结果指定别名WHERE 限定条件比较运算符逻辑运算符where使用实例模糊匹配ORDER BY排序筛选…

语音分类入门案例: 英文数字音频分类

语音分类入门案例: 英文数字音频分类本项目是一个全流程的语音分类项目&#xff0c;内容简单&#xff0c;适合想要涉猎音频分类的小白学习。 推荐将本项目Fork成为自己的项目并运行&#xff0c;以获得更好的学习体验!! 项目地址&#xff1a;语音分类入门&#xff1a;全流程英文…

浅谈企业的数据安全体系建设难点

随着云计算、大数据、物联网、移动互联网、人工智能等新技术的发展&#xff0c;网络边界被不断打破&#xff0c;数字双生、敏捷创新、安全合规驱动快速转型&#xff0c;社会和企业都在面临数字化的转型带来的数据安全风险。 近年来数据泄露的安全事件频发&#xff0c;国家和机…

基于混合整数遗传算法的最优成分选择(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

软著申请注意事项

https://register.ccopyright.com.cn/registration.html 在版权登记中心的网站声明了申请软著是免费的&#xff0c;按照版权登记中心的要求提供材料&#xff0c;按其公布的流程办理即可。 版权登记网站&#xff1a;https://register.ccopyright.com.cn/registration.html 微信…

详解:驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server 建立安全连接。

文章目录1.问题分析2.java连接MySQL数据库3.java连接SQLServer数据库3.1 创建security文件3.2 对需要运行的项目添加参数1.问题分析 SSL协议提供服务主要&#xff1a; 认证用户服务器&#xff0c;确保数据发送到正确的服务器    .加密数据&#xff0c;防止数据传输途中被窃…

EN 14963屋顶覆盖物塑料连续顶灯—CE认证

屋顶覆盖物塑料连续顶灯CE认证&#xff08;欧盟强制认证&#xff09;&#xff0d;简介 在欧盟市场“CE”标志属强制性认证标志&#xff0c;以表明产品符合欧盟《技术协调与标准化新方法》指令的基本要求。这是欧盟法律对产品提出的一种强制性要求。 在屋顶覆盖物塑料连续顶灯产…

固定资产管理软件在金融行业的应用

随着金融业务的拓展&#xff0c;金融机构对办公设备等固定资产投入逐年增加&#xff0c;加上机构的组织架构不断扩大、人员流转增大、分支机构越累越多&#xff0c;这些都给固定资产的管理带来了压力。如果采购环节把控不好&#xff0c;重复采购会给企业带来不小的损失。如果盘…

前端:时间你用对了吗?

导读&#xff1a; 前后端接口中的时间是怎么约定的&#xff1f; 项目中是否有遇到过时区问题引发的bug&#xff1f; 时间应该遵循什么样的使用规范&#xff1f; 如何理解并处理跨时区问题&#xff1f; 关键字&#xff1a;时间戳、时区、设备本地时间、北京时间 1. 支付宝中的跨…

【仁川出差】记2022.10仁川出差

10.16号深圳蛇口港出发&#xff0c;香港机场坐飞机&#xff0c;直达韩国仁川机场。 因为不熟悉&#xff0c;然后人也多&#xff0c;入境时候排队排了很久&#xff0c;出来之后&#xff0c;因为有韩国同事开车来接&#xff0c;解决了第一步怎么到酒店的交通问题。 开车差不多一个…