详解c++STL—容器list

news2025/2/23 13:20:36

目录

1、list基本概念

1.1、概念描述

1.2、结点的组成

1.3、list的优点

1.4、list的缺点

1.5、总结

2、list构造函数

2.1、功能描述

2.2、函数原型

2.3、示例

3、list赋值和交换

3.1、功能描述

3.2、函数原型

3.3、示例

4、list大小操作

4.1、功能描述

4.2、函数原型

4.3、示例

5、list插入和删除

5.1、功能描述

5.2、函数原型

5.3、示例

6、list数据存取

6.1、功能描述

6.2、函数原型

6.3、示例

7、list反转和排序

7.1、功能描述

7.2、函数原型

7.3、示例

8、排序案例

8.1、案例描述

8.2、排序规则

8.3、示例


1、list基本概念

1.1、概念描述

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

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

功能:将数据进行链式存储

1.2、结点的组成

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

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

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器

1.3、list的优点

  • 采用动态存储分配,不会造成内存浪费和溢出
  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

1.4、list的缺点

  • 链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大

1.5、总结

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

STL中list和vector是两个最常被使用的容器,各有优缺点

2、list构造函数

2.1、功能描述

  • 创建list容器

2.2、函数原型

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

2.3、示例

//list容器的构造
void printList(const list<int> li) {
	for (list<int>::const_iterator it = li.begin(); it != li.end();it++) {
		cout << *it << " ";
	}
	cout << endl;
}

void test01() {
	
	//1、默认构造
	list<int> li;

	//插入元素
	li.push_back(10);
	li.push_back(20);
	li.push_back(30);
	li.push_back(40);
	
	//打印链表
	printList(li);

	//2、区间构造
	list<int> li2(li.begin(),li.end());
	printList(li2);

	//3、n个elem
	list<int> li3(4,100);
	printList(li3);

	//4、拷贝构造
	list<int> li4(li3);
	printList(li4);
}

int main() {
	test01();
}

3、list赋值和交换

3.1、功能描述

  • 给list容器进行赋值,以及交换list容器

3.2、函数原型

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

3.3、示例

//list容器的赋值和交换
void printList(const list<int> li) {
	for (list<int>::const_iterator it = li.begin(); it != li.end(); it++) {
		cout << *it << " ";
	}
	cout << endl;
}

void test01() {
	list<int> L;

	L.push_back(10);
	L.push_back(20);
	L.push_back(30);
	L.push_back(40);

	printList(L);

	//1、=赋值
	list<int> L2;
	L2 = L;
	printList(L2);

	//2、assign区间赋值
	list<int> L3;
	L3.assign(L.begin(),L.end());
	printList(L3);

	//3、assign n个elem赋值
	list<int> L4;
	L4.assign(4,100);
	printList(L4);

	//4、交换
	cout << "交换前:" << endl;
	printList(L3);
	printList(L4);

	L4.swap(L3);
	cout << "交换后:" << endl;
	printList(L3);
	printList(L4);


}

int main() {
	test01();
}

4、list大小操作

4.1、功能描述

  • 对list容器的大小进行操作

4.2、函数原型

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

4.3、示例

//list容器的大小操作
void printList(const list<string>& L) {
	for (list<string>::const_iterator it = L.begin(); it != L.end();it++) {
		cout << *it << " ";
	}
	cout << endl;
}

void test01() {
	list<string> ls;
	ls.push_back("ab");
	ls.push_back("cd");
	ls.push_back("ef");
	ls.push_back("gh");

	printList(ls);

	//1、判断是否为空
	if (ls.empty()) {
		cout << "list为空" << endl;
	}
	else {
		cout << "list不为空" << endl;
		//2、获取大小
		cout << "list大小:" << ls.size() << endl;
	}

	//重新指定大小
	//过长,填充默认值,默认为空格" "
	ls.resize(10);
	printList(ls);

	//过长,填充指定值
	ls.resize(15,"hh");
	printList(ls);

	//过短,发生截取
	ls.resize(2);
	printList(ls);

}

int main() {
	test01();

	system("pause");
	return 0;
}

5、list插入和删除

5.1、功能描述

  • 对list容器进行数据的插入和删除

5.2、函数原型

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

5.3、示例

void test01() {
	list<int> li;
	
	//1、尾插 10 20
	li.push_back(10);
	li.push_back(20);
	printList(li);

	//2、头插 200 100 10 20
	li.push_front(100);
	li.push_front(200);
	printList(li);

	//3、尾删 200 100 10
	li.pop_back();
	printList(li);

	//4、头删 100 10
	li.pop_front();
	printList(li);

	//5、插入
	//40 100 10
	li.insert(li.begin(), 40);	//插入一个 
	printList(li);
	
	//40 100 10 50 50
	li.insert(li.end(),2,50); //插入n个elem,2个50
	printList(li);

	//40 100 10 50 50 40 100 10 50 50
	li.insert(li.end(),li.begin(),li.end()); //插入一个区间
	printList(li);

	//6、删除
	//40 50
	li.erase(++li.begin(),--li.end());	//删除指定区间
	printList(li);

	//50
	li.erase(li.begin());	//删除指定位置
	printList(li);

	//7、清空
	li.clear();
	printList(li);
}

int main() {
	test01();

	system("pause");
	return 0;
}

6、list数据存取

6.1、功能描述

  • 对list容器中数据进行存取

6.2、函数原型

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

6.3、示例

void test01() {
	list<int> li;
	li.push_back(10);
	li.push_back(20);
	li.push_back(30);
	li.push_back(40);

	cout << "访问第一个元素:" << li.front() << endl;
	cout << "访问最后一个元素:" << li.back() << endl;
}

int main() {
	test01();
}

注意事项:

list容器没有 [] ,at() ,不可以用这样的方式访问数据,会报错

原因:list本质是一个链表,不是用连续的空间存储数据,迭加器不支持随机访问

7、list反转和排序

7.1、功能描述

  • 将容器中的元素反转,以及将容器中的数据进行排序

7.2、函数原型

  • reverse(); //反转链表
  • sort(); //链表排序

7.3、示例

//list容器的反转和排序
void printList(const list<int>& L) {
	for (list<int>::const_iterator it = L.begin(); it != L.end();it++) {
		cout << *it << " ";
	}
	cout << endl;
}

bool myCompare(int v1,int v2) {
	return v1 > v2;	//v1 > v2 表示降序,反之升序
}

void test01() {
	list<int> li;
	li.push_back(10);
	li.push_back(30);
	li.push_back(20);
	li.push_back(50);
	li.push_back(40);
	
	//1、反转
	cout << "反转前:" << endl;
	printList(li);

	li.reverse();
	cout << "反转后:" << endl;
	printList(li);

	//2、排序
	cout << "排序前:" << endl;
	printList(li);
	
	//默认升序
	li.sort();
	cout << "默认升序排序后:" << endl;
	printList(li);

	//重载降序:
	li.sort(myCompare);
	cout << "重载降序排序后:" << endl;
	printList(li);

}

int main() {
	test01();
}

注意事项:

1、所有不支持随机访问迭代器的容器,都不可以使用标准库的算法

2、不支持随机范文迭代器的容器,但对象内部会提供一些对应算法的成员函数

8、排序案例

8.1、案例描述

将Person自定义数据类型进行排序,Person中属性有姓名、年龄、身高

8.2、排序规则

按照年龄进行升序,如果年龄相同按照身高进行降序

8.3、示例

//list 自定义类型,自定义规则排序案例
//按照年龄进行升序,如果年龄相同按照身高进行降序

#include<list>
class Person {
public:
	Person(string name,int age,int height):m_name(name),m_age(age),m_height(height){}

	string m_name;
	int m_age;
	int m_height;
};

void printList(list<Person> L) {
	for (list<Person>::const_iterator it = L.begin(); it != L.end();it++) {
		cout << "姓名:" << it->m_name << "年龄:" << it->m_age << "身高:" << it->m_height << endl;;
	}
}

bool myCompare(const Person& p1,const Person& p2) {
	if (p1.m_age == p2.m_age) {
		//按身高降序
		return p1.m_height > p2.m_height;
	}
	else{
		//按年龄升序
		return p1.m_age < p2.m_age;
	}
		
	
}
void test01() {
	list<Person> lp;

	Person p1("刘备", 35, 175);
	Person p2("曹操", 45, 180);
	Person p3("孙权", 40, 170);
	Person p4("赵云", 25, 190);
	Person p5("张飞", 35, 160);
	Person p6("关羽", 35, 200);

	lp.push_back(p1);
	lp.push_back(p2);
	lp.push_back(p3);
	lp.push_back(p4);
	lp.push_back(p5);
	lp.push_back(p6);

	cout << "排序前:" << endl;
	printList(lp);

	cout << "------------------" << endl;
	cout << "排序后" << endl;

	//自定义排序规则
	lp.sort(myCompare);
	printList(lp);
}

int main() {
	test01();

	system("pause");
	return 0;
}

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

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

相关文章

ChatGPT的前世今生——混沌初开

目录 ChatGPT的前世今生——混沌初开ChatCPT简介ChatCPT是什么&#xff1f;ChatCPT的火爆程度ChatCPT火爆的原因1、功能强大&#xff0c;应用范围广泛2、训练数据量大&#xff0c;模型效果好3、优秀的商业模式 OpenAI公司公司创始团队 总结公众号文章链接参考链接&#xff1a; …

03C++类与对象之运算符重载

文章目录 C类与对象之运算符重载与const成员运算符重载赋值运算符重载运算符重载 日期类的实现与运算符重载赋值运算符重载比较类运算符的重载二元运算符-的重载前置和后置重载 总体实现代码const成员const的好处1.防止程序员犯错2.提高代码的复用性 const 成员与函数重载规则 …

Qt文件系统源码分析—第三篇QDir

深度 本文主要分析Windows平台&#xff0c;Mac、Linux暂不涉及 本文只分析到Win32 API/Windows Com组件/STL库函数层次&#xff0c;再下层代码不做探究 本文QT版本5.15.2 类关系图 QTemporaryFile继承QFile QFile、QSaveFile继承QFileDevice QFileDevice继承QIODevice Q…

由浅入深Netty基础知识IO相关

目录 1 stream vs channel2 IO 模型3 零拷贝3.1 传统 IO 问题3.2 NIO 优化 4 AIO4.1 文件 AIO4.2 守护线程4.3 网络 AIO 1 stream vs channel stream 不会自动缓冲数据&#xff0c;channel 会利用系统提供的发送缓冲区、接收缓冲区&#xff08;更为底层&#xff09;stream 仅支…

unity学习遇到的问题:解决VS不能加载Unity脚本,MonoBehaviour是灰色的

电脑出了点问题&#xff0c;然后就重装了&#xff0c;重装之后&#xff0c;从gitee上下载了原来的半截代码&#xff0c;结果发现里面的脚本运行出问题了&#xff0c;仔细一看&#xff0c;MonoBehaviour是灰色的&#xff0c;也就是说&#xff0c;加载不了unity的api了&#xff0…

目标检测复盘 --3. RCNN

RCNN的CNN部分使用AlexNet作为backbone来提取特征&#xff0c;Fast RCNN使用了VGG16来作为backboneRCNN将2000个框送入网络提取特征&#xff0c;Fast RCNN是将图像送入CNN来提取特征得到一个特征图将SS(Selective Search)算法获取的提议框映射到上面的特征图上&#xff0c;获取…

怎么通过ssh连上ipv6的服务器?阿里云怎么配置ipv6?wsl2怎么支持ipv6?

最近在研究ipv6&#xff0c;光调通环境居然让我折腾了好多回&#xff0c;现在终于通了 在这里提一句&#xff0c;IPV6和IPV4是两种东西&#xff0c;不要想着ipv6兼容ipv4&#xff0c;你就当它是全新的东西 1.前置条件 1.1我的电脑能访问ipv6 测试通过就代表你电脑可以访问ip…

Redis 哨兵模式的实现详解

文章目录 高可用&#xff08;HA&#xff09;哨兵模式概述哨兵的搭建伪集群 哨兵1. 复制sentinel.conf文件2. 修改sentinel.conf文件3. 新建sentinel26380.conf4. 启动并关联Redis集群5. 启动Sentinel集群6. 查看 Sentinel 信息7. 查看 Sentinel 配置文件 哨兵优化配置 高可用&…

【腾讯云Finops Crane集训营】降本增效神器Crane实战记录

本章目录 前言一、Crane是什么&#xff1f;Crane的主要功能&#xff1f;FinOps 是什么Prometheus是什么Grafana是什么 二、不得不面对的问题&#xff1a;云上资源效能挑战&#xff01;三、云原生场景下的成本优化挑战&#xff1f;四、K8s原生能力的不足五、Crane智能调度助力成…

Linux命令之vim/vi

目录 vim/vi简介 vi/vim 的使用 操作实例 总结 vim/vi简介 所有的 Unix Like 系统都会内建 vi 文书编辑器&#xff0c;其他的文书编辑器则不一定会存在。但是目前我们使用比较多的是 vim 编辑器。Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程…

i.MX6ULL - 远程视频监控方案实现(nginx-rtmp流媒体服务器、ffmpeg推流)

i.MX6ULL - 远程视频监控配置&#xff08;nginx-rtmp流媒体服务器、ffmpeg推流&#xff09; 目录 i.MX6ULL - 远程视频监控配置&#xff08;nginx-rtmp流媒体服务器、ffmpeg推流&#xff09;1、前言2、buildroot文件系统构建2.1 勾选alsa-utils&#xff08;选做&#xff1a;如果…

桥接模式与NAT模式的区别以及设置静态IP

概述 日常我们都会使用到虚拟机&#xff0c;本文章以VMware虚拟机为例&#xff0c;主要介绍下虚拟机设置桥接模式与NAT模式的区别&#xff0c;并通过示意图进行讲解。并且会介绍如何去设置静态IP。 模式介绍 NAT模式NAT模式下 &#xff0c;创建出来的虚拟机只能访问当前主机…

基于ensp的跨地区的校园网组网方案

本博客是基于模拟器ensp的校园网组网方案&#xff0c;有总校区和分校区&#xff0c;主要用了vlan划分、dhcp、nat、ospf、acl、bgp等技术。首先说一下本博客的局限性&#xff1a; 总校区和分校区之间只是使用的传统的bgp建立连接&#xff0c;这样可以在运营商上看到内网的明细&…

HTTP1.1(七)内容协商和资源表述

一 内容协商和资源表述 ① 铺垫 1) 由于一种资源对应许多种状态,所以客户端接收资源表述的转移时需要进行协商比如&#xff1a;[1]、一个来自中国的用户他的浏览器访问一个页面时得到中文页面[2]、一个其它国家的用户访问同一个页面时得到的是他本国的页面补充&#xff1a;…

在线协作助力团队合作:解析多种高效工具实现团队协同

在线协作是通过网络为平台&#xff0c;将团队成员连接起来&#xff0c;使其共同创作、共享讯息&#xff0c;进行团队合作。这种协作方式突破了线下的空间限制性&#xff0c;使团队合作更加及时便捷。因此&#xff0c;越来越多的团队选择了在线协作。 在线协作为团队带来了什么帮…

IDEA 2019.1 与 apache-maven-3.6.3 版本不兼容解决办法

-------IDEA 2019.1 与 apache-maven-3.6.3 版本不兼容 解决办法&#xff1a;降低 Maven版本为 3.3 到底得踩过多少坑&#xff0c;才能让你不再流泪&#xff0c;

接初识HTML中的基础知识,简单明了!!!

续——HTML的基础知识&#xff01;&#xff01;&#xff01; 一、表格 关于HTML中用table表示一个表格&#xff0c;用tr来表示一行&#xff0c;用td来表示一列。 Demo&#xff1a;表示一个二行三列的表格 <!--根--> <html><!--头--> <head><…

瑞吉外卖 - 文件上传与下载功能(15)

某马瑞吉外卖单体架构项目完整开发文档&#xff0c;基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成&#xff0c;有需要的胖友记得一键三连&#xff0c;关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料&#xff1a;https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

pandas dataframe 中 explode()函数用法及效果

最近在使用pyspark处理数据&#xff0c;需要连接各种各样的表和字段&#xff0c;因此记录相关函数的使用情况。今天介绍explode(). 1. explode()函数简介 explode 函数是 pandas.DataFrame 类的一个方法&#xff0c;能够通过pyspark间接调用。 它可以将一个包含list或者其它可…

【零基础学JS - 7 】javaScript 中的8大数据类型

&#x1f468;‍&#x1f4bb; 作者简介&#xff1a;程序员半夏 , 一名全栈程序员&#xff0c;擅长使用各种编程语言和框架&#xff0c;如JavaScript、React、Node.js、Java、Python、Django、MySQL等.专注于大前端与后端的硬核干货分享,同时是一个随缘更新的UP主. 你可以在各个…