【C++STL】list的基本介绍与使用方式


Blog’s 主页: 白乐天_ξ( ✿>◡❛)
🌈 个人Motto:他强任他强,清风拂山冈!
🔥 所属专栏:C++深入学习笔记
💫 欢迎来到我的学习笔记!

一、list的介绍

文档内容以及大致翻译如下图:

  1. list是一种允许在序列内的任何位置进行常数时间的插入删除的序列式容器,并且该容器可以前后双向的迭代;
  2. list的底层是一个带头双向循环链表,双向链表中每个元素存储在不相关的独立结点中,在结点中通过指针指向前一个位置和后一个位置;
  3. listforward_list非常相似,最主要的区别在于:forward_list是单链表,只能进行单方向的迭代;
  4. 与其他容器相比,list通常在任意位置进行插入、删除元素的执行效率更高;
  5. listforward_list最大的缺点就是:不支持在任意位置的随机访问;其次list还需要一些额外的空间来保存每个结点之间的关联信息(对于存储的类型较小的元素的链表来说这可能是一个很重要的因素)。

二、list的使用

2.1.list的定义方式

#include <list>
#include <string>
using namespace std;
int main()
{// 1. 构造某个类型的空容器list<int> lt1;// 构造int类型的空容器// 2. 构造一个含有val的某类型容器list<int> lt2(10, 2);// 构造含有10个2的int类型容器// 3. 构造某类型容器的复制品list<int> lt3(lt2);// 拷贝哦构造int类型的lt2容器的复制品// 4. 使用迭代器构造某一段内容string s("hello world");list<char> lt4(s.begin(), s.end());// 构造string对象某段区间的复制品// 5. 构造数组某段区间的复制品int arr[] = { 1,2,3,4 };int sz = sizeof(arr) / sizeof(int);list<int> lt5(arr, arr + sz);// 构造数组某段区间的复制品return 0;
}

2.2.list的插入删除

2.2.1.push_front(头插)和pop_front(头删)

push_front函数用于头插一个数据,pop_front函数用于头删一个数据。

#include <list>
#include <string>
#include <iostream>
using namespace std;int main()
{list<int> lt;lt.push_front(0);lt.push_front(1);lt.push_front(2);lt.push_front(3);for (auto e : lt){cout << e << " ";}cout << endl;lt.pop_front();for (auto e : lt){cout << e << " ";}cout << endl;lt.pop_front();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

2.2.2.push_back(尾插)和pop_back(尾删)

push_back函数用于尾插一个数据,pop_back用于尾删一个数据。

#include <list>
#include <iostream>
using namespace std;
int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;cout << endl;lt.pop_back();for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

2.2.3.insert

insert的使用形式:

// 在指定迭代器位置插入一个数
iterator insert (iterator position, const value_type& val);
// 在指定迭代器位置插入n个值为val的数void insert (iterator position, size_type n, const value_type& val);
// 在指定迭代器位置插入一段迭代器区间(左闭右开)
template <class InputIterator>void insert (iterator position, InputIterator first, InputIterator last);

代码举例:

#include <iostream>
#include <algorithm>
#include <list>
#include <vector>
using namespace std;int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);// 用法一:在指定迭代器位置插入一个数据list<int>::iterator pos = find(lt.begin(), lt.end(), 2);// 找到数据2的位置,下标赋值给poslt.insert(pos, 10);// 在2的位置插入10for (auto e : lt){cout << e << " ";}cout << endl;// 用法二:再制定迭代器位置插入n个值为val的数据pos = find(lt.begin(), lt.end(), 3);// 找到数据的位置,下标赋值给poslt.insert(pos, 3, 9);// 在pos的位置插入3个9for (auto e : lt){cout << e << " ";}cout << endl;// 用法三:在指定迭代器位置插入一段迭代器区间(左闭右开)vector<int> v(2, 7);//pos = find(lt.begin(), lt.end(), 1);// 找到1的位置,下标赋值给poslt.insert(pos, v.begin(), v.end());// 在1的位置插入一个迭代器区间的数据(2个7)for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

补充:find函数的头文件algorithm,该函返回一个迭代器,指向<font style="color:rgb(42, 43, 46);">[first,last)</font>范围内第一个与val相等的元素。如果没有找到这样的元素,则返回<font style="color:rgb(42, 43, 46);">last</font>

template <class InputIterator, class T>InputIterator find (InputIterator first, InputIterator last, const T& val);
// val就是要查找的值

2.2.4.erase

erase的使用形式:

// 删除指定迭代器位置的元素
iterator erase (iterator position);
// 删除指定迭代器区间(左闭右开)的所有元素
iterator erase (iterator first, iterator last);

代码示例:

#include <iostream>
#include <algorithm>
#include <list>
#include <vector>
using namespace std;int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;// 1 2 3 4 5// erase的第一个用法:list<int>::iterator pos = find(lt.begin(), lt.end(), 2);// 在迭代器区间查找2lt.erase(pos);//删除pos位置的值——2for (auto e : lt){cout << e << " ";}cout << endl;// 1 3 4 5// erase的第二个用法:pos = find(lt.begin(), lt.end(), 4);lt.erase(pos, lt.end());// 删除pos之后的所有数据——删除4、5for (auto e : lt){cout << e << " ";}cout << endl;// 1 3 return 0;
}

2.3.list的迭代器使用

2.3.1.begin和end

正向迭代器遍历容器

#include <vector>
#include <list>
#include <iostream>
using namespace std;int main()
{list<int> lt;// 定义初始化为10个2的lt链表lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);list<int>::iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";++it;}cout << endl;return 0;
}

2.3.2.rbegin和rend

反向迭代器遍历容器

#include <vector>
#include <list>
#include <iostream>
using namespace std;int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);list<int>::reverse_iterator rit = lt.rbegin();while (rit != lt.rend()){cout << *rit << " ";rit++;}cout << endl;return 0;
}

2.4.list元素的获取访问

2.4.1.front和back

front函数返回对链表第一个元素的引用(用于获取list容器当中的第一个元素),在空容器上调用此函数会有未定义的行为。

back函数用于获取list容器当中的最后一个元素。

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);lt.push_back(6);cout << lt.front() << endl;// 1cout << lt.back() << endl; // 6return 0;
}

2.5.list的大小控制

2.5.1.size

size用于获取当前容器中的元素个数。

#include <iostream>
#include <list>
using namespace std;
int main()
{list<int> lt(6, 1);cout << lt.size() << endl;return 0;
}

2.5.2.resize

resize的作用:调整容器的大小,使其包含n个元素(n是新容器的大小)。用法如下:

void resize (size_type n, value_type val = value_type());
  1. 如果n小于当前容器的大小(size),则内容将被减少到前n个元素,并删除超出的元素(并销毁它们)。
  2. 如果n大于当前容器的大小,则通过在末尾插入所需的元素来扩展内容,以达到n的大小。如果指定了val,则将新元素初始化为val的副本,否则将其进行值初始化。
  3. resize函数会通过插入或删除元素来改变容器的实际内容。
  4. val值是一个缺省值,如果未指定,就会使用默认构造函数。
  5. 成员类型<font style="color:rgb(42, 43, 46);">value_type</font>是容器中元素的类型,在<font style="color:rgb(42, 43, 46);">list</font>中定义为第一个模板形参(T)的别名。
#include <iostream>
#include <list>
using namespace std;
int main()
{list<int> lt(6, 1);for (auto e : lt){cout << e << " ";}cout << endl;lt.resize(8, 2);// 传了值的情况for (auto e : lt){cout << e << " ";}cout << endl;lt.resize(2);// 没传值,缩容size到3=2for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

2.5.3.empty

empty的作用:判断容器是否为空(即容器的size是否为0)。用法如下:

bool empty() const;

代码示例:

#include <iostream>
#include <list>
using namespace std;
int main()
{list<int> lt1(10, 2);cout << lt1.empty() << endl;list<int> lt2;cout << lt2.empty() << endl;return 0;
}

2.5.4.clear

clear函数用于判断当前容器是否为空。用法如下:

void clear();

代码示例:

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> lt(5, 1);for (auto e : lt){cout << e << " ";}cout << endl;lt.clear();cout << lt.empty() << endl;return 0;
}

2.6.list的操作函数

2.6.1.sort

sort函数的作用:对list中的元素进行排序, sort可以将容器中的数据默认排位升序。用法如下:

void sort();
template <class Compare>
void sort(Compare comp);

代码示例:

#include <list>
#include <iostream>
using namespace std;int main()
{list<int> lt;lt.push_back(3);lt.push_back(1);lt.push_back(0);lt.push_back(9);lt.push_back(4);lt.push_back(3);lt.push_back(2);lt.push_back(6);lt.push_back(3);lt.push_back(7);lt.push_back(5);lt.push_back(10);for (auto e : lt){cout << e << " ";}cout << endl;lt.sort();for (auto e : lt){cout << e << " ";}cout << endl;//3 1 0 9 4 3 2 6 3 7 5 10//0 1 2 3 3 3 4 5 6 7 9 10return 0;
}

2.6.2.splice

splice的作用(文档翻译过来):将元素从 “x” 转移到容器当中,并将这些元素插入到特定位置。这样做能够有效地把这些元素插入到容器里,同时从 “x” 中移除它们,进而改变两个容器的大小。此操作既不涉及任何元素的构造,也不涉及任何元素的破坏。无论 “x” 是左值还是右值,也无论元素的值类型是否支持移动构造,这些元素都会被转移。

用法如下:

splice函数用于两个list容器之间的拼接,其有三种拼接方式:

  1. 将整个容器拼接到另一个容器的指定迭代器位置。
  2. 将容器当中的某一个数据拼接到另一个容器的指定迭代器位置。
  3. 将容器指定迭代器区间的数据拼接到另一个容器的指定迭代器位置。
// 将x的所有元素传输到容器中
void splice(iterator position, list& x);
// 只将x指向i的元素传输到容器中
void splice(iterator position, list& x, iterator i);
// 将范围[first,last]从x传输到容器中
void splice(iterator position, list& x, iterator first, iterator last);
// 其中x代表list链表
// position代表容器中插入x的元素的位置
// 指定x中的元素范围的迭代器。将[first,last)范围内的元素转移到position。注意:包括first指向的元素,但是不包括last指向的元素。

代码示例:

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> lt1(4, 1);list<int> lt2(4, 2);lt1.splice(lt1.begin(), lt2);// 在开始位置插入整个list容器for (auto e : lt1){cout << e << " ";}cout << endl;// 此时lt2已经变成空的list容器了for (auto e : lt2){cout << e << " ";}cout << endl;list<int> lt3(4, 3);list<int> lt4(4, 4);lt3.splice(lt3.begin(), lt4, lt4.begin());// 将lt4的第一个位置的数据转移到lt3链表的靠头for (auto e : lt3){cout << e << " ";}cout << endl;for (auto e : lt4){cout << e << " ";}cout << endl;list<int> lt5(4, 2);list<int> lt6(4, 6);lt5.splice(lt5.begin(), lt6, lt6.begin(), lt6.end()); //将容器lt6的指定迭代器区间内的数据拼接到容器lt5的开头for (auto e : lt5){cout << e << " ";}cout << endl; //6 6 6 6 2 2 2 2return 0;
}

2.6.3.remove

从容器中移除值为<font style="color:rgb(42, 43, 46);">val</font>的所有元素。调用这些对象的析构函数,并按移除的元素数量减少容器大小。

remove函数用于删除容器当中特定值的元素。用法如下:

void remove (const value_type& val);

代码示例:

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> lt;lt.push_back(2);lt.push_back(1);lt.push_back(6);lt.push_back(2);lt.push_back(0);lt.push_back(5);lt.push_back(4);for (auto e : lt){cout << e << " ";}cout << endl;lt.remove(2);for (auto e : lt){cout << e << " ";}cout << endl;return 0;
}

2.6.4.remove_if

<font style="color:rgb(42, 43, 46);">remove_if</font>允许使用除相等比较之外的其他条件来确定元素是否被删除。(满足条件就可以使用删除:但是不能是比较像等条件)这将调用这些对象的析构函数,并根据删除的元素数量减少容器大小。用法如下:

template <class Predicate>void remove_if (Predicate pred);

代码示例:

#include <iostream>
#include <list>
using namespace std;bool single_digit(const int& val)
{return val < 10;
}
int main()
{list<int> lt;lt.push_back(10);lt.push_back(4);lt.push_back(7);lt.push_back(18);lt.push_back(2);lt.push_back(5);lt.push_back(9);for (auto e : lt){cout << e << " ";}cout << endl; //10 4 7 18 2 5 9lt.remove_if(single_digit); //删除容器当中值小于10的元素for (auto e : lt){cout << e << " ";}cout << endl; //10 18return 0;
}

2.6.5.unique

unique用于删除容器中连续的重复元素。注意:要想做到真正的驱虫,就需要在对去重前对容器内的元素进行排序。用法如下:

void unique();
template <class BinaryPredicate>void unique (BinaryPredicate binary_pred);

代码示例:

#include <iostream>
#include <list>
using namespace std;
int main()
{list<int> lt;lt.push_back(4);lt.push_back(5);lt.push_back(2);lt.push_back(9);lt.push_back(1);lt.push_back(3);lt.push_back(0);lt.push_back(6);lt.push_back(4);lt.push_back(1);lt.push_back(0);lt.push_back(7);lt.push_back(8);for (auto e : lt){cout << e << " ";}cout << endl;lt.sort();// 先升序排序一下for (auto e : lt){cout << e << " ";}cout << endl;lt.unique();// 删除掉连续的重复元素for (auto e : lt){cout << e << " ";}cout << endl;// 0 1 2 3 4 5 6 7 8 9return 0;
}

2.6.6.merge

merge函数的作用:将一个有序的list容器合并到另一个有序的list容器当中,使得合并后的list容器仍然有序。(类似于归并排序)

  1. 把列表中的各个有序位置上的所有元素转移到一个容器中。这里有一个前提条件,两个容器(原列表和目标容器)都必须已经是有序状态。
  2. 这个操作会有效地使列表 x 变为空,也就是删除了 x 中的所有元素,同时将这些元素插入到目标容器中的有序位置。目标容器的大小会根据传输过来的元素数量进行扩展。
  3. 该操作在执行过程中,不会构造或销毁任何元素。无论 x 是左值还是右值,也无论元素的类型(value_type)是否支持移动构造,元素都会被转移。

用法如下:

void merge(list& x);
template <class Compare>
void merge(list& x, Compare comp);

代码示例:

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> lt1;lt1.push_back(3);lt1.push_back(1);lt1.push_back(8);lt1.push_back(9);lt1.push_back(6);list<int> lt2;lt2.push_back(2);lt2.push_back(10);lt2.push_back(7);lt2.push_back(4);lt1.push_back(5);lt1.sort();lt2.sort();lt1.merge(lt2);for (auto e : lt1){cout << e << " ";}cout << endl;return 0;
}

2.6.7.reverse

reverse函数用于将容器中的元素进行逆置,即反转列表容器中元素的顺序。。用法如下:

void reverse();

代码如下:

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> lt1;lt1.push_back(1);lt1.push_back(3);lt1.push_back(2);lt1.push_back(4);lt1.push_back(7);for (auto e : lt1){cout << e << " ";}cout << endl;lt1.reverse();for (auto e : lt1){cout << e << " ";}cout << endl;return 0;
}

2.6.8.assign

assign函数的作用:用于将新内容分配给容器,替换其当前内容,新内容的赋予方式有两种:

  1. n个值为val的数据分配给容器;
  2. 将所给的迭代器区间当中的内容分配给容器。

其他:

  1. 为被分配的元素所需的任何存储空间,都会使用内部分配器来进行分配。
  2. 在进行调用之前,容器中原本保存的任何元素都将被销毁,然后被新构造的元素所替换(这里不是进行元素赋值操作)。
template <class InputIterator>
void assign(InputIterator first, InputIterator last);
void assign(size_type n, const value_type& val);

代码示例:

#include <iostream>
#include <string>
#include <list>
using namespace std;int main()
{list<char> lt(3, 'a');lt.assign(3, 'b'); //将新内容分配给容器,替换其当前内容for (auto e : lt){cout << e << " ";}cout << endl; //b b bstring s("hello world");lt.assign(s.begin(), s.end()); //将新内容分配给容器,替换其当前内容for (auto e : lt){cout << e << " ";}cout << endl; //h e l l o   w o r l dreturn 0;
}

2.6.9.swap

swap函数用于交换两个容器的内容。

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

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

相关文章

ESP32-IDF 非易失存储 NVS

目录 零、前言一、基本介绍1、配置结构体1.1 nvs_entry_info_t 2、常用 API2.1 nvs_flash_init2.2 nvs_flash_init_partition2.3 nvs_flash_init_partition_ptr2.4 nvs_flash_erase2.5 nvs_flash_erase_partition2.6 nvs_flash_erase_partition_ptr2.7 nvs_flash_generate_keys…

华为杯”第十三届中国研究生数学建模竞赛-C题:基于无线通信基站的室内三维定位问题

目录 摘 要: 1. 问题重述 1.1 提出问题 1.2 问题要求 2. 基本假设与符号说明 2.1 基本假设 2.2 符号说明 3. 问题分析 4. 问题 1:基站定位模型建立 4.1 LOS 及 NLOS 环境下的定位算法 4.1.1 TDOA 定位计算方法 4.1.2 LOS 与 NLOS 环境下的误差模型 4.1.3 LOS 情况下的 CHAN 算…

element plus中menu菜单技巧

我在使用element plus的menu&#xff08;侧边栏&#xff09;组件的过程中遇到了一些问题&#xff0c;就是menu编写样式和路由跳转&#xff0c;下面给大家分享以下&#xff0c;我是怎么解决的。 1.页面效果 我要实现的网站布局是这样的&#xff1a; 侧边栏折叠以后的效果&#…

python爬虫快速入门之---Scrapy 从入门到包吃包住

python爬虫快速入门之—Scrapy 从入门到包吃包住 文章目录 python爬虫快速入门之---Scrapy 从入门到包吃包住一、scrapy简介1.1、scrapy是什么?1.2、Scrapy 的特点1.3、Scrapy 的主要组件1.4、Scrapy 工作流程1.5、scrapy的安装 二、scrapy项目快速入门2.1、scrapy项目快速创建…

详解equals底层原理

equals 方法是 Java 中用于比较两个对象是否“相等”的方法。在 Java 中&#xff0c;每个类都继承自 java.lang.Object 类&#xff0c;而 equals 方法正是定义在 Object 类中的一个方法。默认情况下&#xff0c;Object 类的 equals 方法比较的是两个对象的内存地址&#xff08;…

【GIT】.gitignore文件的使用

使用 Visual Studio 开发项目&#xff0c;并使用 Git 将项目推送到 GitLab 时&#xff0c;有一些文件是自动生成的、特定于开发环境的文件&#xff0c;通常不应该被推送到远程仓库。这就是 .gitignore 文件的作用&#xff0c;它可以告诉 Git 忽略这些文件或文件夹。 1. 哪些文…

解释 RESTful API,以及如何使用它构建 web 应用程序(AI)

RESTful API&#xff08;Representational State Transfer&#xff09;是一种基于HTTP协议的软件架构风格&#xff0c;用于构建可扩展、可维护和可重用的网络服务。 RESTful API的特点包括&#xff1a; 1. 基于资源&#xff1a;每个API都代表一个或多个资源&#xff0c;这些资…

SQL 多表联查

SQL JOIN (w3school.com.cn) SQL join用于根据两个或多个表中的列之间的关系&#xff0c;从这些表中查询数据。 之前跟着老师学数据库的时候学过&#xff0c;最近又在比较频繁的使用&#xff0c;再复习一下。 Person表&#xff1a; Id_P &#xff1a;居民编号。主键 …

大数据开发基于Hadoop+springboot平台的岗位推荐系统

文章目录 前言项目介绍技术介绍功能介绍核心代码数据库参考 系统效果图文章目录 前言 文章底部名片&#xff0c;获取项目的完整演示视频&#xff0c;免费解答技术疑问 项目介绍 随着网络科学技术不断的发展和普及化&#xff0c;用户在寻找适合自己的信息管理系统时面临着越来…

成功解决pycharm软件中按住Ctrl+点击指定函数却不能跳转到对应库中的源代码

成功解决pycharm软件中按住Ctrl点击指定函数却不能跳转到对应库中的源代码 目录 解决问题 解决方法 解决问题 在pycharm软件中按住Ctrl点击指定函数却不能跳转到对应库中的源代码 解决方法

探索秘境:如何使用智能体插件打造专属的小众旅游助手『小众旅游探险家』

文章目录 摘要引言智能体介绍和亮点展示介绍亮点展示 已发布智能体运行效果智能体创意想法创意想法创意实现路径拆解 如何制作智能体可能会遇到的几个问题快速调优指南总结未来展望 摘要 本文将详细介绍如何使用智能体平台开发一款名为“小众旅游探险家”的旅游智能体。通过这…

个人健康系统|个人健康数据管理系统|基于小程序+java的个人健康数据管理系统设计与实现(源码+数据库+文档)

个人健康数据管理系统 目录 基于小程序java的个人健康数据管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师…

ArcGIS Pro SDK (十七)宗地结构

ArcGIS Pro SDK (十七)宗地结构 环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0 宗地结构 1 获取活动记录 string errorMessage = await QueuedTask.Run(() => {

高可用之限流-07-token bucket 令牌桶算法

限流系列 开源组件 rate-limit: 限流 高可用之限流-01-入门介绍 高可用之限流-02-如何设计限流框架 高可用之限流-03-Semaphore 信号量做限流 高可用之限流-04-fixed window 固定窗口 高可用之限流-05-slide window 滑动窗口 高可用之限流-06-slide window 滑动窗口 sen…

重构案例:将纯HTML/JS项目迁移到Webpack

我们已经了解了许多关于 Webpack 的知识&#xff0c;但要完全熟练掌握它并非易事。一个很好的学习方法是通过实际项目练习。当我们对 Webpack 的配置有了足够的理解后&#xff0c;就可以尝试重构一些项目。本次我选择了一个纯HTML/JS的PC项目进行重构&#xff0c;项目位于 GitH…

web3学习-区块链基础知识

1.1 区块链技术简史 block chain 点对点的分布式交易系统 比特币协议并不是图灵完备的。 以太坊协议加入了智能合约&#xff0c;智能合约是以太坊协议与比特币协议的最大区别&#xff08;图灵完备&#xff09; 1.2、区块链设计哲学 去中心化 由于没有中心化的数据库作为…

记录一个容易混淆的 Spring Boot 项目配置文件问题

记录一个容易混淆的 Spring Boot 项目配置文件问题 去年&#xff0c;我遇到了这样一个问题&#xff1a; 在这个例子中&#xff0c;由于密码 password 以 0 开头&#xff0c;当它被 Spring Boot 的 bean 读取时&#xff0c;前导的 0 被自动去掉了。这导致程序无法正确读取密码。…

网盘直链下载神器NDM

工具介绍 ​Neat Download Manager分享一款网盘不限速神器,安装步骤稍微有一点繁琐,但实际体验下载速度飞快,个人实际体验还是非常不错的 NDM是一款免费且强大的下载工具。可以帮助你下载各种文件&#xff0c;还能够在多任务下载中保持出色的速度及其稳定性 通过网盘分享的文…

【MySQL核心面试题】MySQL 核心 - Explain 执行计划详解!

欢迎关注公众号 【11来了】&#xff08;文章末尾即可扫码关注&#xff09; &#xff0c;持续 中间件源码、系统设计、面试进阶相关内容 在我后台回复 「资料」 可领取 编程高频电子书&#xff01; 在我后台回复「面试」可领取 30w 字的硬核面试笔记&#xff01; 感谢你的关注&…

【ios】在 SwiftUI 中实现可随时调用的加载框

在 SwiftUI 项目中实现一个自定义的加载框&#xff08;loading&#xff09;功能&#xff0c;可以在任意位置调用&#xff0c;以便显示加载动画或者进度条。下面的教程将详细讲解如何创建一个可复用的 Loading 组件&#xff0c;并通过通知机制控制其显示和隐藏。 先上效果&…