【C++初阶】list的常见使用操作

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

  • 一、list的基本概念
  • 二、list的构造
      • 2.1 默认构造
      • 2.2 拷贝构造函数
      • 2.3 用n个值为val的元素构造
      • 2.4 用迭代区间的元素构造
  • 三、list的迭代器begin + end
  • 四、list的容量操作
      • 4.1 size
      • 4.2 empty
  • 五、list的遍历
      • 5.1 迭代器遍历
      • 5.2 范围for
  • 六、list的获取元素操作
      • 6.1 front
      • 6.2 back
      • 七、list的对容器修改操作
      • 7.1 push_front
      • 7.2 pop_front
      • 7.3 push_back
      • 7.4 pop_back
      • 7.5 insert + 迭代器随机访问问题
      • 7.6 erase + 迭代器失效问题
      • 7.7 swap
      • 7.8 clear
  • 八、其他操作(常见)
      • 8.1 reverse
      • 8.2 sort
      • 8.3 remove
      • 8.4 unique

一、list的基本概念

  • 功能:将数据进行链式存储。
  • 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。
  • 链表的组成:链表由一系列结点组成。
  • 结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
  • STL中的链表是一个 双向带头循环链表。这意味着链表中的每个节点都包含指向前一个节点和后一个节点的指针,而头节点和尾节点互相连接形成一个循环。这样的设计使得在链表中插入、删除节点的操作更加高效,同时也提供了双向遍历链表的能力。
  • list的数据域同样可以存储不同数据类型,因此它同样是一个模板容器
    在这里插入图片描述

二、list的构造

2.1 默认构造

list<int> l;

构造空的list对象

在这里插入图片描述

2.2 拷贝构造函数

【函数原型】

list (const list& x)

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l1{ 1,2,3,4,5 };
	cout << "l1:";
	for (auto x : l1)
	{
		cout << x << ' ';
	}
	cout << endl;

	// 拷贝构造函数
	list<int> l2(l1);

	cout << "l2:";
	for (auto x : l2)
	{
		cout << x << ' ';
	}
	cout << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

2.3 用n个值为val的元素构造

【函数原型】

list (size_type n, const value_type& val = value_type())

没有显示给出第二个参数默认为0

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	// 初始化10个'a'
	list<char> lc(10, 'a');
	for (auto x : lc)
	{
		cout << x << ' ';
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

2.4 用迭代区间的元素构造

【函数原型】

list (InputIterator first, InputIterator last)

注意:迭代区间的范围通常是左闭右开的[first, last)

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	int a[] = { 0,1,2,3,4,5,6,7,8,9 };
	int size = sizeof(a) / sizeof(a[0]); // 计算元素个数
	list<int> ll(a, a + size);
	
	for (auto x : ll)
	{
		cout << x << ' ';
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

三、list的迭代器begin + end

  • begin:返回第一个元素的迭代器
  • end:返回最后一个元素下一个位置的迭代器
    在这里插入图片描述

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l4{ 1,2,3 };
	list<int>::iterator it = l4.begin();
	while (it != l4.end())
	{
		cout << *it << ' ';
		it++;
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

四、list的容量操作

4.1 size

功能:返回list中有效节点的个数

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l4{ 1,2,3 };
	cout << "有效节点个数:" << l4.size() << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

4.2 empty

功能:检测list是否为空,是返回true,否则返回false

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l4;
	if (l4.empty())
	{
		cout << "l4是空结点" << endl;
	}
	else
	{
		cout << "l4不是空结点" << endl;
		cout << "l4的有效结点" << l4.size() << endl;
	}
	return 0;
}

【输出结果】

在这里插入图片描述

五、list的遍历

list本质是链表,不是用连续性空间存储数据的。因此,list是不支持下标访问[]

5.1 迭代器遍历

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<char> lc;
	// 尾插
	lc.push_back('c');
	lc.push_back('x');
	lc.push_back('k');
	lc.push_back('h');
	lc.push_back('s');

	list<char>::iterator it = lc.begin();
	while (it != lc.end())
	{
		cout << *it << ' ';
		it++;
	}
	cout << endl;

	// 以上代码可以结合成for循环的形式
	// list<char>::iterator太长可使用auto
	for (auto it = lc.begin(); it != lc.end(); it++)
	{
		cout << *it << ' ';
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

5.2 范围for

由于list支持迭代器,那么就一定支范围for。因为范围for的底层就是迭代器实现的

【代码实现】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<char> lc;
	// 尾插
	lc.push_back('c');
	lc.push_back('x');
	lc.push_back('k');
	lc.push_back('h');
	lc.push_back('s');

	for (auto x : lc)
	{
		cout << x << ' ';
	}
	cout << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

六、list的获取元素操作

6.1 front

功能:返回list的第一个节点中值的引用。

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l5;
	l5.push_back(1);
	l5.push_back(2);
	l5.push_back(3);
	l5.push_back(4);
	l5.push_back(5);

	cout << "第一个结点的值:" <<  l5.front() << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

6.2 back

功能:返回list的最后一个节点中值的引用。

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l5;
	l5.push_back(1);
	l5.push_back(2);
	l5.push_back(3);
	l5.push_back(4);
	l5.push_back(5);

	cout << "最后一个节点的值:" << l5.back() << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

七、list的对容器修改操作

7.1 push_front

功能:头插

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l5;
	l5.push_back(1);
	l5.push_back(2);
	l5.push_back(3);
	l5.push_back(4);
	l5.push_back(5);

	// 头插
	l5.push_front(100);
	for (auto x : l5)
	{
		cout << x << ' ';
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

7.2 pop_front

功能:头删

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l5;
	l5.push_back(1);
	l5.push_back(2);
	l5.push_back(3);
	l5.push_back(4);
	l5.push_back(5);

	l5.pop_front();
	for (auto x : l5)
	{
		cout << x << ' ';
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

7.3 push_back

功能:尾插

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l5;
	l5.push_back(1);
	l5.push_back(2);
	l5.push_back(3);
	l5.push_back(4);
	l5.push_back(5);

	for (auto x : l5)
	{
		cout << x << ' ';
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

7.4 pop_back

功能:尾删

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l5;
	l5.push_back(1);
	l5.push_back(2);
	l5.push_back(3);
	l5.push_back(4);

	l5.pop_back();
	for (auto x : l5)
	{
		cout << x << ' ';
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

7.5 insert + 迭代器随机访问问题

vector开始insert都是使用迭代器来访问的

在这里插入图片描述

假设已有数据:1 2 3 4,现要在2后插入100。根据以往所学知识不难可以写出以下代码:

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l5;
	l5.push_back(1);
	l5.push_back(2);
	l5.push_back(3);
	l5.push_back(4);

	l5.insert(l5.begin() + 2, 100);

	for (auto x : l5)
	{
		cout << x << ' ';
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

可惜报错了。

原因是:list本质是链表,不是用连续性空间存储数据的,迭代器也是不支持随机访问的,只能支持++--操作(支持双向遍历)

那可能就有人想,++的底层就是+1,那么为什么+1不行,而++可以?

这都归功于类的封装,在对迭代器封装的时候,重新的定义了这些符号的意义,也就是符号的重载。这才使得我们能就像使用指针一样去使用迭代器。下面是list的源代码(部分)

 self& operator++() 
 { 
     node = (link_type)((*node).next);
     return *this;
 }

 self operator++(int) 
 { 
     self tmp = *this;
     ++*this;
     return tmp;
 }
self& operator--() 
 { 
     node = (link_type)((*node).prev);
     return *this;
}
self operator--(int) 
{ 
    self tmp = *this;
    --*this;
    return tmp;
}

【正确写法】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l5;
	l5.push_back(1);
	l5.push_back(2);
	l5.push_back(3);
	l5.push_back(4);

	auto it = l5.begin();
	for (int i = 0; i < 2; i++)
	{
		it++;
	}
	l5.insert(it, 100);

	for (auto x : l5)
	{
		cout << x << ' ';
	}
	cout << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

接下来我们想,对于insertlist会和vector一样有迭代器失效的问题吗?

答案是没有。原因是:vector在插入时,如果遇到扩容才会存在迭代器失效,而list不存在扩容。

7.6 erase + 迭代器失效问题

功能:删除list position位置的元素

在这里插入图片描述

【代码示例】

目的:删除所有元素

#include <iostream>
#include <list>
using namespace std;

int main()
{
	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	list<int> l(a, a + sizeof(a) / sizeof(a[0]));

	cout << "删除前:";
	for (auto x : l)
	{
		cout << x << ' ';
	}
	cout << endl;

	auto it = l.begin();
	while (it != l.end())
	{
		l.erase(it);
		++it;
	}

	cout << "删除后:";
	for (auto x : l)
	{
		cout << x << ' ';
	}
	cout << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

程序崩了!

这和vector的情况类似,erase()函数执行后,it所指向的节点已被删除,因此it无效。

解决方法:在下一次使用it时,必须先给其赋值

【正确代码】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	list<int> l(a, a + sizeof(a) / sizeof(a[0]));

	cout << "删除前:";
	for (auto x : l)
	{
		cout << x << ' ';
	}
	cout << endl;

	auto it = l.begin();
	while (it != l.end())
	{
		// l.erase(it); 错误
		it = l.erase(it);
	}

	cout << "删除后:";
	for (auto x : l)
	{
		cout << x << ' ';
	}
	cout << endl;

	return 0;
}

【输出结果】

在这里插入图片描述

7.7 swap

功能:交换两个list中的元素

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l1;
	l1.push_back(1);
	l1.push_back(1);
	l1.push_back(1);
	l1.push_back(1);

	list<int> l2;
	l2.push_back(2);
	l2.push_back(2);
	l2.push_back(2);
	l2.push_back(2);

	cout << "交换前" << endl;
	cout << "l1:";
	for (auto x : l1)
	{
		cout << x << ' ';
	}
	cout << endl;
	cout << "l2:";
	for (auto x : l2)
	{
		cout << x << ' ';
	}
	cout << endl;
	l1.swap(l2);

	cout << "交换后" << endl;
	cout << "l1:";
	for (auto x : l1)
	{
		cout << x << ' ';
	}
	cout << endl;
	cout << "l2:";
	for (auto x : l2)
	{
		cout << x << ' ';
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

7.8 clear

功能:清空list中所有的有效元素

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> l1;
	l1.push_back(1);
	l1.push_back(1);
	l1.push_back(1);
	l1.push_back(1);

	l1.clear();
	if (l1.empty())
	{
		cout << "已清空" << endl;
	}
	return 0;
}

【输出结果】

在这里插入图片描述

八、其他操作(常见)

在这里插入图片描述

主要讲解画方括号的,剩下的自行了解即可~

8.1 reverse

功能:逆置list

在这里插入图片描述

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<char> lc1;
	lc1.push_back('a');
	lc1.push_back('b');
	lc1.push_back('c');
	lc1.push_back('d');

	// list的逆置接口
	lc1.reverse();
	for (auto x : lc1)
	{
		cout << x << ' ';
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

其实list设计这个接口没有必要,因为算法库(algorithm)也设计了reverse算法

在这里插入图片描述

【代码示例】

#include <iostream>
#include <list>
#include <algorithm> // 使用算法库需要包含头文件
using namespace std;

int main()
{
	list<char> lc1;
	lc1.push_back('a');
	lc1.push_back('b');
	lc1.push_back('c');
	lc1.push_back('d');
	
	// 算法库逆置
	reverse(lc1.begin(), lc1.end());

	for (auto x : lc1)
	{
		cout << x << ' ';
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

8.2 sort

功能:排序list。注意:list底层的sort是归并算法

在这里插入图片描述

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> ll;
	ll.push_back(5);
	ll.push_back(4);
	ll.push_back(1);
	ll.push_back(2);
	ll.push_back(6);
	ll.push_back(3);
	
	ll.sort();
	for (auto x : ll)
	{
		cout << x << ' ';
	}
	cout << endl;
	return 0;
}

但是算法库里面也设计了一个sort,但注意:算法库里面的sort对于list是用不了的。

在这里插入图片描述

首先从模板参数上就能发现名字有所不同

事实上,这是因为迭代器从功能上进行了分类。

  • InputIterator就是所有迭代器都可以用。

在这里插入图片描述

  • bidirectional这种迭代器就适合双向的迭代器用。

在这里插入图片描述

  • RadomAccessIterator就适合随机迭代器去使用。
    在这里插入图片描述

因此,由于list适合双向迭代器,所以用不了库里的sort(RadomAccessIterator)

那我们怎么知道一个容器是什么类型的迭代器呢?很简单,查文档就行:点击跳转

这里我为大家总结了一些常见容器的迭代器:

在这里插入图片描述

因此,list接口中实现sort还是有点意义的。我只是说“有点”。

在排序中,vector的排序速度要比list快。这是因为vector是一个连续存储的容器,它的元素在内存中是相邻的,可以利用局部性原理进行高效的排序算法,如快速排序。

相比之下,list是一个链表结构,其元素在内存中是分散存储的,无法直接利用局部性原理,因此排序操作的性能通常较慢。

在某些特定情况下,list可能更适合进行插入和删除操作,因为它对于这些操作的开销较小。因此,在选择容器时,应该根据具体的需求来决定使用哪种容器。

8.3 remove

功能:删除list某个有效数据

在这里插入图片描述

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> lit;
	lit.push_back(1);
	lit.push_back(2);
	lit.push_back(3);
	lit.push_back(4);
	
	for (auto x : lit)
	{
		cout << x << ' ';
	}
	cout << endl;

	// 删除4
	lit.remove(4);
	for (auto x : lit)
	{
		cout << x << ' ';
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

8.4 unique

功能:去重。但是要注意首先得先进行排序,才能进行去重。否则效率极低

在这里插入图片描述

【代码示例】

#include <iostream>
#include <list>
using namespace std;

int main()
{
	list<int> lit;
	lit.push_back(3);
	lit.push_back(4);
	lit.push_back(1);
	lit.push_back(2);
	lit.push_back(4);
	
	for (auto x : lit)
	{
		cout << x << ' ';
	}
	cout << endl;

	// 去重
	lit.sort();
	lit.unique();
	for (auto x : lit)
	{
		cout << x << ' ';
	}
	cout << endl;
	return 0;
}

【输出结果】

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法

初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法 在对经过修模的三维模型进行OBJ格式轻量化压缩处理的过程中&#xff0c;可能会遇到一些常见问题。以下是一些常见问题以及相应的处理方法&#xff1a; 1、顶点丢失和形状变形&#xff1a;在减小顶点数量的过程中…

k8s 常用命令(三)

1、查看版本信息&#xff1a;kubectl version [rootmaster ~]# kubectl version [rootmaster ~]# kubectl version Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", GitCommit:"ca643a4d1f7bfe34773c74f7952…

前端学习记录~2023.8.10~JavaScript重难点实例精讲~第6章 Ajax

第 6 章 Ajax 前言6.1 Ajax的基本原理及执行过程6.1.1 XMLHttpRequest对象&#xff08;1&#xff09;XMLHttpRequest对象的函数&#xff08;2&#xff09;XMLHttpRequest对象的属性 6.1.2 XMLHttpRequest对象生命周期&#xff08;1&#xff09;创建XMLHttpRequest对象&#xff…

Django基础3——视图函数

文章目录 一、基本了解1.1 Django内置函数1.2 http请求流程 二、HttpRequest对象&#xff08;接受客户端请求&#xff09;2.1 常用属性2.2 常用方法2.3 服务端接收URL参数2.4 QueryDict对象2.5 案例2.5.1 表单GET提交2.5.2 表单POST提交2.5.3 上传文件 三、HttpResponse对象&am…

OnePlus Open可折叠手机:规格、价格、发布日期等详细信息汇总!

我们知道OnePlus可折叠手机即将问世,无论它是否被命名为OnePlus Open。我们迫不及待地想让它到来,为该公司再添一根弦,为最好的可折叠手机增添一个新的竞争对手。 OnePlus以前没有生产过任何可折叠产品,但它确实拥有合作伙伴公司Oppo的丰富知识,并可以向三星、摩托罗拉和…

【C语言】基础知识杂记(整理自用)

前言 之前一直在学新知识&#xff0c;最近打算复习一下之前学的&#xff0c;所以写了这篇文章&#xff0c;记录一下不熟练的知识点&#xff0c;自用&#xff0c;对大家帮助可能不是很大。 double类型与float类型 编译器默认7.0为double类型 在数据后加一个f&#xff0c;编译…

机器人远程控制软件设计

机器人远程控制软件设计 That’s all.

2023年高教社杯 国赛数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&…

麒麟系统上安装 MySQL 8.0.24

我介绍一下在麒麟系统上安装 MySQL 8.0.24 的详细步骤&#xff0c;前提是您已经下载了 mysql-8.0.24-linux-glibc2.12-x86_64.tar.xz 安装包。其实安装很简单&#xff0c;但是有坑&#xff0c;而且问题非常严重&#xff01;由于麒麟系统相关文章博客较少&#xff0c;导致遇到了…

openCV实战-系列教程7:轮廓检测2与模板匹配(轮廓检测/轮廓特征/轮廓近似/轮廓边界矩阵/轮廓边界圆/模版匹配)、原理解析、源码解读

打印一个图片可以做出一个函数&#xff1a; def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 1、轮廓特征与近似 1.1 轮廓特征 前面我们计算了这个图片的轮廓&#xff1a; 它的轮廓信息保存在了contours中&#xff0c;取出第一个轮廓&…

还不知道怎么提示LLM?ChatGPT提示入门

文章目录 简介&#xff1a;什么是人工智能&#xff1f;什么是提示过程&#xff1f;为什么会出现这样的差异&#xff1f; 为什么需要提示过程&#xff1f;1) 文章摘要2) 数学问题求解 如何进行提示过程&#xff1f;角色提示&#xff1a;多范例提示&#xff1a;无范例提示单范例提…

春秋云镜 CVE-2019-16113

春秋云镜 CVE-2019-16113 Bludit目录穿越漏洞 靶标介绍 在Bludit<3.9.2的版本中&#xff0c;攻击者可以通过定制uuid值将文件上传到指定的路径&#xff0c;然后通过bl-kernel/ajax/upload-images.php远程执行任意代码。 启动场景 漏洞利用 exp https://github.com/Kenun…

长时间序列的25米全球sar卫星镶嵌数据

数据简介 1992年JAXA&#xff08;Japan Aerospace Exploration Agency&#xff0c;日本宇宙航空研究开发机构&#xff09;发射了一颗JERS-1卫星&#xff0c;该卫星携带有18*24m分辨率的SAR传感器。随后&#xff0c;JAXA又在2006年和2014年分别发射了带有SAR传感器的alos卫星和…

数学建模及数据分析 || 4. 深度学习应用案例分享

PyTorch 深度学习全连接网络分类 文章目录 PyTorch 深度学习全连接网络分类1. 非线性二分类2. 泰坦尼克号数据分类2.1 数据的准备工作2.2 全连接网络的搭建2.3 结果的可视化 1. 非线性二分类 import sklearn.datasets #数据集 import numpy as np import matplotlib.pyplot as…

[MyBatis系列②]Dao层开发的两种方式

目录 1、传统开发 1.1、代码 1.2、存在的问题 2、代理开发 2.1、开发规范 2.2、代码 ⭐mybatis系列①&#xff1a;增删改查 1、传统开发 传统的mybatis开发中&#xff0c;是在数据访问层实现相应的接口&#xff0c;在实现类中用"命名空间.id"的形式找到对应的映…

Springboot+mybatis-plus+dynamic-datasource+Druid 多数据源 分布式事务

Springbootmybatis-plusdynamic-datasourceDruid 多数据源事务&#xff0c;分布式事务 文章目录 Springbootmybatis-plusdynamic-datasourceDruid 多数据源事务&#xff0c;分布式事务0.前言1. 基础介绍ConnectionFactoryAbstractRoutingDataSource 动态路由数据源的抽象类 Dyn…

SpringBoot概述SpringBoot基础配置yml的使用多环境启动

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 SpringBoot简介 一、 SpringBoot概述1.1 起步依赖…

前端(十四)——DOM节点操作手册:你需要了解的一切

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;DOM节点操作手册&#xff1a;你需要了解的一切 文章目录 前言DOM基础知识操作现有节点创建新节点遍历节点树修改节点属性和样式事件处理实践应用动态创建表格动态更新列表 前言 DOM&#xff08;文档…

Python爬虫逆向实战案例(五)——YRX竞赛题第五题

题目&#xff1a;抓取全部5页直播间热度&#xff0c;计算前5名直播间热度的加和 地址&#xff1a;https://match.yuanrenxue.cn/match/5 cookie中m值分析 首先打开开发者工具进行抓包分析&#xff0c;从抓到的包来看&#xff0c;参数传递了查询参数m与f&#xff0c;同时页面中…

C# 工厂模式

一、概述 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。在C#中&#xff0c;工厂模式通过定义一个公共接口或抽象类来创建对象&#xff0c;而具体的对象创建则由工厂类来实现。 工厂模式主要包含三个角色…