STL之list

目录

list定义和结构

list容器模板接受两个参数:

list容器的特点

双向性

动态大小

不连续存储

实例

代码输出

需要注意的点

list常用函数

代码示例


list定义和结构

list的使用频率不高,在做题时极少遇到需要使用list的情景。

list是一种双向链表容器,他是标准模板库(STL)提供的一种序列容器。list容器以节点(node)的形式存储元素,并使用指针将这些节点链接在一起,形成一个链表结构。

list容器的定义和结构如下:

cpp 复制代码
template<class T,class Allocator = std::allocator<T>>
class list;

list容器模板接受两个参数:

1.T:指定容器中存储的元素类型。

2.Allocator:可选,指定用于分配内存的分配器类型,默认为std::allocator<T>。

list容器的特点

双向性

每个节点都包含指向前一个节点和后一个节点的指针,因此可以在常数时间内在链表中的任意位置进行插入、删除和访问操作。

动态大小

链表的大小可以根据需要动态扩展或收缩,不需要预先指定容器的大小。

不连续存储

链表的节点可以在内存中的任意位置分布,不要求连续存储,因此插入和删除操作不会导致元素的移动。

list容器提供了一系列成员函数和迭代器来操作和访问链表中的元素,包括插入、删除、访问、反转等操作。可以使用迭代器来遍历链表中的元素。

实例

cpp 复制代码
#include<iostream>
#include<list>
using namespace std;
int main()
{
	list<int>myList;

	//在链表尾部插入元素
	myList.push_back(1);
	myList.push_back(2);
	myList.push_back(3);

	//在链表头部插入元素
	myList.push_front(0);

	//遍历链表并输出元素
	for (int num : myList)
	{
		cout << num << ' ';
	}
	cout << endl;
}

代码输出

需要注意的点

由于list是双向链表,因此插入和删除操作的时间复杂度是常量时间O(1),但访问和查找操作的时间复杂度为O(n),其中n是链表的大小。因此,如果需要频繁进行随机访问操作,可能更适合使用支持随机访问的容器,如vector或deque。

list常用函数

1、push_back():将元素插入到链表的末尾

2、push_front():将元素插入到链表的开头

3、pop_back():移除链表末尾的元素

4、pop_front():移除链表开头的元素

5、size():返回链表中的元素个数

6、empty():检查链表是否为空

7、clear():清空链表中的所有元素

8、front():返回链表中第一个元素的引用

9、back():返回链表中最后一个元素的引用

10、begin():返回指向链表第一个元素的迭代器

11、end():返回指向链表最后一个元素的迭代器

12、insert():在指定位置之前插入一个或多个元素

13、erease():从链表中移除指定位置的一个或多个元素

代码示例

cpp 复制代码
#include<iostream>
#include<list>
using namespace std;
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	//创建一个list<int>对象myList
	list<int>myList;

	//向myList尾部添加元素
	for (int i = 1; i <= 5; i++)
	{
		myList.push_back(i);
	}

	//从头到尾输出myList中的元素
	for (const auto& i : myList)
	{
		cout << i << ' ';
	}
	cout << endl;

	//将myList中的元素反转
	reverse(myList.begin(), myList.end());

	for (const auto& i : myList)
	{
		cout << i << ' ';
	}
	cout << endl;

	//在第一个元素的后一个位置加上元素0
	myList.insert(++myList.begin(), 0);
	
	for (const auto& i : myList)
	{
		cout << i << ' ';
	}
	cout << endl;

	myList.erase(++++myList.begin(), --myList.end());

	cout << "链表的大小为:" << myList.size() << endl;

	for(const auto & i:myList)
	{
		cout << i << ' ';
	}
	return 0;
}

输出结果:

相关推荐
马士兵教育4 分钟前
AI大模型教程【LangChainV1.0+LangGraph V1.0】企业级Agent全集开发实战!
开发语言·人工智能·考研·面试·职场和发展
superantwmhsxx6 分钟前
JAVA系统中Spring Boot 应用程序的配置文件:application.yml
java·开发语言·spring boot
智者知已应修善业7 分钟前
【C++非递归剪枝问题凑钱方案数】2024-7-18
c语言·c++·经验分享·笔记·算法·剪枝
郝学胜-神的一滴7 分钟前
Pytorch张量核心运算精讲:从类型转换到数值操作全解析
开发语言·人工智能·pytorch·python·深度学习·程序人生·机器学习
BigLeo8 分钟前
c++中,声明(Declaration)与定义(Definition)有什么不同?
c++
Yolo_TvT9 分钟前
C++:缺省参数
开发语言·c++·算法
Sgf22712 分钟前
第7章 文件操作
服务器·开发语言·数据库·python
ew4521812 分钟前
【java】基于hutool实现.Excel导出任意多级自定义表头数据
java·开发语言·excel
徒 花13 分钟前
HCIA知识整理2
开发语言·php
承渊政道13 分钟前
【优选算法】(实战领略前缀和的真谛)
开发语言·数据结构·c++·笔记·学习·算法