【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…

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;…

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;✌️大厂码农|毕设布道师…

重构案例:将纯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; 感谢你的关注&…

MySQL【知识改变命运】10

联合查询 0.前言1.联合查询在MySQL里面的原理2.练习一个完整的联合查询2.1.构造练习案例数据2.2 案例&#xff1a;⼀个完整的联合查询的过程2.2.1. 确定参与查询的表&#xff0c;学⽣表和班级表2.2.2. 确定连接条件&#xff0c;student表中的class_id与class表中id列的值相等2.…

wordpress 子比主题美化 四宫格 多宫格 布局插件

wordpress 主题美化 四宫格 多宫格 布局插件&#xff08;只在子比主题上测试过&#xff0c;其它主题没测试&#xff09; A5资源网四宫格布局插件是一个功能丰富的WordPress插件,专为创建自适应的四宫格布局而设计。这个插件具有以下主要特点: 灵活的布局: 支持1到8个宫格的自定…

Springboot整合knife4j生成文档

前言 在开发过程中&#xff0c;接口文档是很重要的内容&#xff0c;用于前端对接口的联调&#xff0c;也用于给其他方使用。但是手写相对比较麻烦。 当然也有swagger之类的&#xff0c;但是界面没有那么友好。 官网&#xff1a; 整合步骤 整合依赖 需要根据版本进行&…

如何使用 pnpm 进行打补丁patch操作?推荐两个方法

前言 作为一个前端开发者&#xff0c;我们每天都在和各种各样的库和依赖打交道。node_modules 目录中存放着我们项目的各种依赖。我们有时需要对其中的一些依赖进行修改&#xff0c;比如修复某个 bug 或者增加某些自定义功能。这时候&#xff0c;给 node_modules 打补丁就显得…

为您的 WordPress 网站打造完美广告布局 A5广告单元格插件

一个为 WordPress 网站量身定制的强大工具,它将彻底改变您展示广告的方式 灵活多变的布局设计 A5 广告单元格插件的核心优势在于其无与伦比的灵活性。无论您是想要创建整齐的网格布局,还是希望打造独特的不规则设计,这款插件都能满足您的需求。 自定义网格数量&#xff1a;从 2…

androidStudio编译导致的同名.so文件冲突问题解决

files found with path lib/arm64-v8a/libserial_port.so from inputs: ...\build\intermediates\library_jni\debug\jni\arm64-v8a\libserial_port.so C:\Users\...\.gradle\caches\transforms-3\...\jni\arm64-v8a\XXX.so 解决方式如下&#xff1a; 1.将gradle缓存文件删…