c++的学习之路:14、list(1)

本章讲一下如何使用list

一、list介绍

首先还是看一看官方文档的介绍如下图,如下方五点:

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

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

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

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

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

在图二就是一些参数,可以明显看到没有【】,因为list就是相当于一个带头双向链表,参数和之前学习的差不多,就不详细讲了。

二、增

如下方代码就是就创建了一个链表为l1和l2进行尾插和头插然后在利用for进行打印。

void Test1()

{

list<int> l1;

l1.push_back(1);

l1.push_back(2);

l1.push_back(3);

l1.push_back(4);

list<int> l2;

l2.push_front(1);

l2.push_front(2);

l2.push_front(3);

l2.push_front(4);

for (auto li : l1)

{

cout << li << ' ';

}

cout << endl;

for (auto li : l2)

{

cout << li << ' ';

}

cout << endl;

}

三、删

如下就是先尾删打印在进行头删打印,代码和测试如下。

void Test2()

{

list<int> l1;

l1.push_back(1);

l1.push_back(2);

l1.push_back(3);

l1.push_back(4);

l1.push_back(5);

l1.push_back(6);

for (auto li : l1)

{

cout << li << ' ';

}

cout << endl;

l1.pop_back();

l1.pop_back();

for (auto li : l1)

{

cout << li << ' ';

}

cout << endl;

l1.pop_front();

l1.pop_front();

for (auto li : l1)

{

cout << li << ' ';

}

cout << endl;

}

四、查和改

下方代码就是利用find函数进行插在,找到了3然后返回位置给pos在这个地方进行插入30,然后在查找30再把这个删掉。

void Test3()

{

list<int> l1;

l1.push_back(1);

l1.push_back(2);

l1.push_back(3);

l1.push_back(4);

l1.push_back(5);

l1.push_back(6);

for (auto li : l1)

{

cout << li << ' ';

}

cout << endl;

auto pos = find(l1.begin(),l1.end(),3);

l1.insert(pos, 30);

for (auto li : l1)

{

cout << li << ' ';

}

cout << endl;

pos= find(l1.begin(), l1.end(), 30);

l1.erase(pos);

for (auto li : l1)

{

cout << li << ' ';

}

cout << endl;

}

五、交换

交换两个链表的数值,这个原理就是交换头指针,如下方代码所示。

void Test4()

{

list<int> l1;

l1.push_back(1);

l1.push_back(2);

l1.push_back(3);

l1.push_back(4);

l1.push_back(5);

l1.push_back(6);

list<int> l2;

l2.push_back(10);

l2.push_back(20);

l2.push_back(30);

l2.push_back(40);

l2.push_back(50);

l2.push_back(60);

for (auto li : l1)

{

cout << li << ' ';

}

cout << endl;

for (auto li : l2)

{

cout << li << ' ';

}

cout << endl;

l1.swap(l2);

for (auto li : l1)

{

cout << li << ' ';

}

cout << endl;

for (auto li : l2)

{

cout << li << ' ';

}

cout << endl;

}

六、代码

复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <list>
using namespace std;

void Test1()
{
	list<int> l1;
	l1.push_back(1);
	l1.push_back(2);
	l1.push_back(3);
	l1.push_back(4);
	list<int> l2;
	l2.push_front(1);
	l2.push_front(2);
	l2.push_front(3);
	l2.push_front(4);
	for (auto li : l1)
	{
		cout << li << ' ';
	}
	cout << endl;
	for (auto li : l2)
	{
		cout << li << ' ';
	}
	cout << endl;
}

void Test2()
{
	list<int> l1;
	l1.push_back(1);
	l1.push_back(2);
	l1.push_back(3);
	l1.push_back(4);
	l1.push_back(5);
	l1.push_back(6);
	for (auto li : l1)
	{
		cout << li << ' ';
	}
	cout << endl;
	l1.pop_back();
	l1.pop_back();
	for (auto li : l1)
	{
		cout << li << ' ';
	}
	cout << endl;
	l1.pop_front();
	l1.pop_front();
	for (auto li : l1)
	{
		cout << li << ' ';
	}
	cout << endl;
}

void Test3()
{
	list<int> l1;
	l1.push_back(1);
	l1.push_back(2);
	l1.push_back(3);
	l1.push_back(4);
	l1.push_back(5);
	l1.push_back(6);
	for (auto li : l1)
	{
		cout << li << ' ';
	}
	cout << endl;
	auto pos = find(l1.begin(),l1.end(),3);
	l1.insert(pos, 30);
	for (auto li : l1)
	{
		cout << li << ' ';
	}
	cout << endl;
	pos= find(l1.begin(), l1.end(), 30);
	l1.erase(pos);
	for (auto li : l1)
	{
		cout << li << ' ';
	}
	cout << endl;
}

void Test4()
{
	list<int> l1;
	l1.push_back(1);
	l1.push_back(2);
	l1.push_back(3);
	l1.push_back(4);
	l1.push_back(5);
	l1.push_back(6);
	list<int> l2;
	l2.push_back(10);
	l2.push_back(20);
	l2.push_back(30);
	l2.push_back(40);
	l2.push_back(50);
	l2.push_back(60);
	for (auto li : l1)
	{
		cout << li << ' ';
	}
	cout << endl;
	for (auto li : l2)
	{
		cout << li << ' ';
	}
	cout << endl;
	l1.swap(l2);
	for (auto li : l1)
	{
		cout << li << ' ';
	}
	cout << endl;
	for (auto li : l2)
	{
		cout << li << ' ';
	}
	cout << endl;
}

int main()
{
	Test4();
}
相关推荐
apcipot_rain8 小时前
C++转Java日记(04)
java·开发语言·c++
云和数据.ChenGuang10 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
WL学习笔记11 小时前
vector模拟实现
c++
La Pulga12 小时前
【FreeRTOS源码学习笔记】任务延时列表
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蜗牛一步步往上爬13 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
楚山之石13 小时前
【JCO】mpMRI 先行替代 TURBT 初始分期:BladderPath 随机试验让 MIBC 患者提前 45 天得到正确治疗
人工智能·学习·mri·医学影像
张张123y15 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
Peter-OK17 小时前
PostgreSQL学习笔记(入门-进阶-精通说明)
笔记·学习·postgresql
wo_jack17 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
承渊政道17 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor