C++ STL 序列式容器之(三)-- List

一、什么是list?

Lists are sequence containers that allow constant time insert and erase operations anywhere within the sequence, and iteration in both directions.

列表是序列容器,允许在序列中的任何位置进行以常量时间插入和擦除操作,以及双向迭代。

简单的来说:list是一个带头双向循环列表

二、list的使用

2.1 list的构造list的默认构造:
cpp 复制代码
 #define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <list>
int main()
{
	list<int> list1;
	return 0;
}

2.2 、用n的val构造:(其中val的类型是list模版显式实例化的类型)

cpp 复制代码
int main()
{
	//list<int> list1;
	list<int> list1(3, 3);
	list<string> list2(2, "hello");
	return 0;
}
2.3、 用迭代器区间构造
cpp 复制代码
int main()
{
	//list<int> list1;
	//list<int> list1(3, 3);
	//list<string> list2(2, "hello");
	int arr[4] = { 3,4,5,6 };
	list<int> list1(arr, arr + sizeof(arr) / sizeof(int));
	return 0;
}
2.4、list的拷贝构造
cpp 复制代码
int main()
{
	//list<int> list1;
	//list<int> list1(3, 3);
	//list<string> list2(2, "hello");
	int arr[4] = { 3,4,5,6 };
	list<int> list1(arr, arr + sizeof(arr) / sizeof(int));
	list<int> list2(list1);
	return 0;
}

拷贝后:

三、list的增删查改

3.1、尾插尾删
cpp 复制代码
int main()
{
	list<int> list1;
	list1.push_back(1);
	list1.push_back(2);
	list1.push_back(3);
	list1.push_back(4);
	list1.push_back(5);
	list1.pop_back();
	for (auto e : list1)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}
3.2 list的头插头删
cpp 复制代码
int main()
{
	list<int> list1;
	list1.push_front(1);
	list1.push_front(2);
	list1.push_front(3);
	list1.push_front(4);
	list1.pop_front();
	for (auto e : list1)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}
3.3 list 的任意位置插入

任意位置插入val:

cpp 复制代码
int main()
{
	list<int> list1;
	list1.push_front(1);
	list1.push_front(2);
	list1.push_front(3);
	list1.push_front(4);
	list1.pop_front();
	for (auto e : list1)
	{
		cout << e << " ";
	}
	cout << endl;
	list<int>::iterator it = list1.begin();
	++it;
	list1.insert(it, 6);
	for (auto e : list1)
	{
		cout << e << " ";
	}
	return 0;
}

注意:第一个参数为const_iterator,第二个参数为list显式实例化的类型;

list的iterator是双向迭代器支持++ -- 但不支持+ -;

任意位置插入n个val:

cpp 复制代码
int main()
{
	list<int> list1;
	list1.push_back(3);
	list1.push_back(4);
	list1.push_back(5);
	list1.push_back(6);
	list1.insert(list1.begin(), 3, 8);
		for (auto e : list1)
	{
		cout << e << " ";
	}
	return 0;
}
3.4list的任意位置删除

任意位置删除:

cpp 复制代码
int main()
{
	list<int> list1;
	list1.push_back(3);
	list1.push_back(4);
	list1.push_back(5);
	list1.push_back(6);
	list<int>::iterator it1 = list1.begin();
	it1++;
	it1 = list1.erase(it1);
	it1++;
	it1 = list1.erase(it1);
	for (auto e : list1)
	{
		cout << e << " ";
	}
	cout << endl;
	//cout << *it1 << " ";//报错
	return 0;
}

注意:erase返回的是删除的节点下一个节点的迭代器!

四、list的其他成员函数;

4.1 remove函数

作用: 相当于 find + erase ,先查找找到的了就删除,找不到啥事不干;

cpp 复制代码
int main()
{
	list<int> list1;
	list1.push_back(3);
	list1.push_back(4);
	list1.push_back(5);
	list1.push_back(6);
	list1.remove(5);
	list1.remove(99);
		for (auto e : list1)
	{
		cout << e << " ";
	}
	return 0;
}
4.2 splice函数

作用: 把一个链表转移到另一个链表的某个节点下;

cpp 复制代码
int main()
{
	list<int> list1;
	for (int i = 1; i <= 5; ++i)
	{
		list1.push_back(i * 10);
	}
	for (auto e : list1)
	{
		cout << e << " ";
	}
	cout << endl;
	list<int> list2;
	for (int i = 1; i <= 5; ++i)
	{
		list2.push_back(i);
	}
	for (auto e : list2)
	{
		cout << e << " ";
	}
	cout << endl;
	list<int> ::iterator it = list1.begin();
	++it;
	list1.splice(it, list2);
	for (auto e : list1)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}
4.3merge函数

作用:归并两个链表

cpp 复制代码
int main()
{
	list<int> list1;
	for (int i = 2; i < 6; ++i)
	{
		list1.push_back(i);
	}
	for (auto e : list1)
	{
		cout << e << " ";
	}
	cout << endl;
	list<int> list2;
	for (int i = 4; i < 9; ++i)
	{
		list2.push_back(i);
	}
	for (auto e : list2)
	{
		cout << e << " ";
	}
	cout << endl;
	list1.merge(list2);
	for (auto e : list1)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

注意:默认按升序归并;

**以上是list的基本用法,如果对您有所帮助记得点赞收藏+关注哦!!**谢谢!!!

咱下期见!!!

相关推荐
找不到、了2 分钟前
关于MyBatis 的懒加载(Lazy Loading)机制
java·mybatis
一杯科技拿铁7 分钟前
go‑cdc‑chunkers:用 CDC 实现智能分块 & 强力去重
c++·mfc
啃火龙果的兔子30 分钟前
快速搭建Java服务指南
java·开发语言
未来之窗软件服务32 分钟前
智慧收银系统开发进销存库存统计,便利店、水果店、建材与家居行业的库存汇总管理—仙盟创梦IDE
java·开发语言·ide·进销存·仙盟创梦ide·东方仙盟·收银台
pusue_the_sun41 分钟前
从零开始搞定类和对象(上)
开发语言·c++
CodeCraft Studio43 分钟前
国产化PDF处理控件Spire.PDF教程:Java 提取 PDF 图片,高质量提取与图片过滤技巧
java·python·pdf·国产化·文档处理·spire·pdf图片提取
归云鹤1 小时前
QT信号和槽怎么传输自己定义的数据结构
开发语言·数据结构·qt
ytttr8731 小时前
MATLAB 实现 SRCNN 图像超分辨率重建
开发语言·matlab·超分辨率重建
饭碗的彼岸one1 小时前
重生之我在10天内卷赢C++ - DAY 1
linux·开发语言·c++·经验分享·笔记·学习方法
DIY机器人工房1 小时前
【科普】在STM32中有哪些定时器?
c语言·嵌入式·定时器·diy机器人工房