当前位置: 首页 > news >正文

【C++】list

OK,最近浅浅学习了STL的list,有兴趣不妨垂阅!

目录

1.constructor

2.assign

 3.insert

4.erase 

5. reverse

6.swap 

 7.merge

8.unique 

9.splice 

10.小知识


 

同样的,使用list 需要包含一个头文件<list>。<list>中实现了一个类模板list就是我在本博客想要介绍的!!

那么list到底是个啥?

list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代,其底层结构是带头(哨兵卫)双向循环链表。举个栗子:

老规矩,我只介绍一些list 常用接口,且我只介绍C++98版本的接口,其他接口可去list文档细细查阅!!

1.constructor

重载了4个构造函数。好像没什么好介绍的,跟vector的构造函数有异曲同工之妙!!


 1.explicit list (const allocator_type& alloc = allocator_type())

无参构造。

#include<list>
using namespace std;
void test()
{list<int> il;list<double> dl;
}
int main()
{test();return 0;
}

2.explicit list (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type())

 构造并初始化n个val。

#include<list>
#include<iostream>
using namespace std;
void test()
{list<int> l(5, 6);for (auto ch : l){cout << ch << ' ';}
}
int main()
{test();return 0;
}


3.template <class InputIterator>

list (InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type())

使用迭代器进行初始化构造,也就是构造并用迭代器区间[first,last)的值(包括*first到*(last-1))初始化。

#include<list>
#include<vector>
#include<iostream>
using namespace std;
void test()
{vector<double> v(3, 9.7);list<double> l(v.begin(), v.end());for (auto ch : l){cout << ch << ' ';}
}
int main()
{test();return 0;
}


4.list (const list& x)

拷贝构造。

#include<list>
#include<iostream>
using namespace std;
void test()
{list<int> l1(5, 6);list<int> l2 = l1;//调用拷贝构造for (auto ch : l2){cout << ch << ' ';}
}
int main()
{test();return 0;
}

2.assign

为list容器分配新内容,替换其当前内容,并相应地修改其大小。


1.template <class InputIterator>  

void assign (InputIterator first, InputIterator last)

用迭代器区间[first,last)的值来替换list容器原值。 

#include<list>
#include<vector>
#include<iostream>
using namespace std;
void test()
{vector<char> v(6, 'a');list<char> l(2, 'b');l.assign(v.begin(), v.end());for (auto& ch : l){cout << ch << ' ';}
}
int main()
{test();return 0;
}


2.void assign (size_type n, const value_type& val)

 用n个val的值来替换list容器原值。

#include<list>
#include<iostream>
using namespace std;
void test()
{list<char> l(2, 'b');l.assign(5, 'Z');for (auto& ch : l){cout << ch << ' ';}
}
int main()
{test();return 0;
}

 3.insert

 看到重载了3个成员函数,其中1个还是函数模板。

均是通过在指定位置的元素之前插入新元素来扩展容器。

我就介绍其中1个:iterator insert (iterator position, const value_type& val)。 在迭代器position指定位置的元素前插入新元素val。返回一个迭代器,该迭代器指向新插入元素。

#include<list>
#include<iostream>
using namespace std;
void test()
{list<int> l(8, 0);auto it = l.begin();for (int i = 0; i < 4; ++i){it++;}it=l.insert(it, 1);cout << *it << endl;for (auto ch : l){cout << ch << ' ';}
}

4.erase 

 重载了2个函数:iterator erase (iterator position)和iterator erase (iterator first, iterator last)

从列表容器中删除单个元素(位置)或一系列元素([first,last),这有效地减少了被移除的元素数量,从而减小了容器的大小。返回一个迭代器,指向被函数调用擦除的最后一个元素之后的元素。如果操作擦除了序列中的最后一个元素,则这是容器端(end())。

#include<list>
#include<iostream>
using namespace std;
void test()
{list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);auto it = l.erase(l.begin());//iterator erase (iterator position)cout << *it << endl;
}
int main()
{test();return 0;
}

#include<list>
#include<iostream>
using namespace std;
void test()
{list<int> l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);auto it = l.erase(l.begin(),--l.end());//iterator erase (iterator first, iterator last)cout << *it << endl;
}
int main()
{test();return 0;
}

5. reverse

 反转列表容器中元素的顺序。

这个接口和算法库<algorithm>里面的函数模板reverse使用于list容器来说,功能是一样的。

#include<list>
#include<iostream>
#include<algorithm>
using namespace std;
void test()
{list<int> l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);list<int> l2(l1);l1.reverse();//list自带的reversereverse(l2.begin(), l2.end());//算法库的reversefor (auto ch : l1){cout << ch << ' ';}cout << endl;for (auto ch : l2){cout << ch << ' ';}
}
int main()
{test();return 0;
}

6.swap 

重载了2个成员函数:void sort()和template <class Compare> void sort (Compare comp)

对列表中的元素进行排序,改变它们在容器中的位置。

其中第1个成员函数void sort()是排升序的,至于另一个成员函数(函数模板)可以实现按需排序,我还不会操作好吧。

#include<list>
#include<iostream>
using namespace std;
void test()
{list<int> l1;l1.push_back(4);l1.push_back(10);l1.push_back(5);l1.push_back(6);l1.sort();//排升序for (auto ch : l1){cout << ch << ' ';}
}
int main()
{test();return 0;
}

PS:算法库<algorithm> 里面也有sort,那为什么list内部要实现一个sort呢?

因为算法库的sort不支持排序list容器的数据,为什么不支持,请看小知识部分!

 7.merge

这个接口重载有2个成员函数,我就介绍其中这个: void merge (list& x)。这个函数的功能就是将2个均为升序或均为降序的list容器对象合并成1个,合并完后有1个list容器对象就空了。

#include<list>
#include<iostream>
using namespace std;
void test()
{list<int> l1;l1.push_back(1);list<int> l2;l2.push_back(9);l2.push_back(10);l2.push_back(15);l1.merge(l2);cout << "l1: ";for (auto ch : l1){cout << ch << ' ';}cout << endl;cout << "l2: ";for (auto ch : l2){cout << ch << ' ';}
}
int main()
{test();return 0;
}

8.unique 

这个接口重载有2个成员函数,我就介绍其中这个void unique()。从list容器中每个连续的相等元素组中删除除第一个元素外的所有元素。

#include<list>
#include<iostream>
using namespace std;
void test()
{list<int> l;l.push_back(1);l.push_back(2);l.push_back(2);l.push_back(4);l.push_back(5);l.push_back(4);l.push_back(7);l.unique();for (auto ch : l){cout << ch << ' ';}
}
int main()
{test();return 0;
}

所以,如果list对象中,所有相等元素能“挨在一起”的话,例如1个有序list对象,调用了这个接口的话,剩下的元素都是独一无二的,例如:

#include<list>
#include<iostream>
using namespace std;
void test()
{list<char> l;l.push_back('a');l.push_back('c');l.push_back('e');l.push_back('e');l.push_back('e');l.push_back('f');l.push_back('f');l.unique();for (auto ch : l){cout << ch << ' ';}
}
int main()
{test();return 0;
}

9.splice 

 重载了3个成员函数。


1.void splice (iterator position, list& x)

将x的所有元素转移(剪切)到容器中,具体是转移(剪切)到position前。

#include<list>
#include<iostream>
using namespace std;
void test()
{list<char> l1(3, 'e');list<char> l2(3, 'b');l2.splice(--l2.end(), l1);for (auto ch : l2){cout << ch << ' ';}
}
int main()
{test();return 0;
}

PS:x和*this可以是同1个 list容器对象,下同。


2.void splice (iterator position, list& x, iterator i)

 只将i指向的元素从x转移(剪切)到容器中,具体是转移(剪切)position前。

#include<list>
#include<iostream>
using namespace std;
void test()
{list<char> l(3, 'c');l.push_back('a');l.splice(l.begin(), l, --l.end());for (auto ch : l){cout << ch << ' ';}
}
int main()
{test();return 0;
}


3.void splice (iterator position, list& x, iterator first, iterator last)

 将范围[first,last)从x转移(剪切)到容器中,具体转移(剪切)到position前。

#include<list>
#include<iostream>
using namespace std;
void test()
{list<char> l(3, 'c');l.push_back('a');l.splice(l.begin(), l, --l.end(), l.end());for (auto ch : l){cout << ch << ' ';}
}
int main()
{test();return 0;
}


总的来说,这个接口可以用来:

1.调整当前list对象元素顺序;

2.将1个list对象元素转移(剪切)到另外1个list对象上。

10.小知识

抛砖引玉:

#include<list>
#include<iostream>
using namespace std;
void test()
{list<char> l(4, 'c');auto it = l.begin();cout << *(it + 3) << endl;
}
int main()
{test();return 0;
}

为什么报错呢?

 因为list的迭代器属于双向迭代器(bidirectional_iterator)。浅浅介绍一下这些知识:


迭代器按功能来划分可以分为:普通正向迭代器(iterator)、普通反向迭代器(reverse_iterator)、const正向迭代器(const_iterator)、const反向迭代器(const_reverse_iterator)。  

迭代器按性质类划分可以分为:单向迭代器(forward_iterator)、双向迭代器(bidirectional_iterator)、随机迭代器(random_access_iterator):

  • 单向迭代器(forward_iterator):支持++等操作,不支持--、+、-等操作。forward_list、unordered_map等容器的迭代器都属于单向迭代器。
  • 双向迭代器(bidirectional_iterator):支持++、--等操作,不支持+、-等操作。list、map等容器的迭代器都属于双向迭代器。
  • 随机迭代器(random_access_iterator):支持++、--、+、-等操作。string、vector等容器的迭代器都属于随机迭代器。
  • 其实除了这3种,还引申出了2种抽象的迭代器:只读迭代器(input_iterator)、只写迭代器(output_iterator),这2种迭代器没有哪种容器直接对应它们。

还要明白这些个迭代器的包含关系,如上图:随机迭代器是1种特殊的双向迭代器;双向迭代器是1种特殊的单向迭代器;单向迭代器是1种特殊的只读迭代器 ,亦是1种特殊的只写迭代器。


 如何查看某个容器的迭代器性质上归属于哪种迭代器呢?去查询对应的文档就行了。

例如list,看到文档Member types:

 那么容器迭代器的性质上归属于哪种迭代器是什么决定的?

……

回答这个问题之前,别忘了迭代器是在模拟指针的行为。

……

是由该容器底层结构实现的。例如:

……

vector底层是顺序表,得益于其底层物理空间是连续的,所以其迭代器可以支持++、--、+、-等操作以达到任意位置的随机访问。

……

list底层是带头双向循环链表,所以其迭代器可以支持++、--等操作,但是不支持+、-等操作,例如其迭代器执行+n操作,无法得到下n个节点的迭代器,因为它们底层物理空间并不连续,固然可以用操作符重载+来实现,但是是不划算的。

……

 forward_list底层是单链表,所以其迭代器可以支持++等操作,但是不支持--、+、-等操作。例如其迭代器执行--操作,无法得到上1个节点的迭代器,因为它们底层物理空间并不连续且逻辑上是单向的。


容器迭代器的性质,决定了该容器适用哪些算法。

例如算法库<algorithm>中的sort,看到其重载了2个函数模板,分别是template <class RandomAccessIterator> void sort (RandomAccessIterator first, RandomAccessIterator last)和template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp)。这里sort函数模板模板参数名字(之一)是RandomAccessiterator,这个名字不是白取的,就是暗示这个算法只能排序其迭代器是随机迭代器的容器的数据。

若某个迭代器是非随机迭代器的容器使用算法库的sort,例如:

#include<list>
#include<iostream>
#include<algorithm>
using namespace std;
void test()
{list<int> l(2, 3);sort(l.begin(), l.end());
}
int main()
{test();return 0;
}

报错: 

若迭代器是随机迭代器的容器使用算法库的sort,例如:

#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
void test()
{string s;s.push_back('a');s.push_back('e');s.push_back('b');s.push_back('g');sort(s.begin(), s.end());for (auto ch : s){cout << ch << ' ';}
}
int main()
{test();return 0;
}

成功排升序:

造成sort只能排序迭代器是随机迭代器的容器数据的原因在于:sort底层是快速排序,需要迭代器能支持++、--、+、-等操作的,具体的就要去看sort的源代码了。

这就是为什么 算法库的sort不支持排序list容器的数据了。

 所以,以后使用算法库的算法时,要搞清楚该容器适合用该算法吗!!!

感谢阅读!

相关文章:

【C++】list

OK&#xff0c;最近浅浅学习了STL的list&#xff0c;有兴趣不妨垂阅&#xff01; 目录 1.constructor 2.assign 3.insert 4.erase 5. reverse 6.swap 7.merge 8.unique 9.splice 10.小知识 同样的&#xff0c;使用list 需要包含一个头文件<list>。<list&g…...

keepalive的高可用集群

一、keepalived概述 1.keepalive的工作原理 keepalive是专门为了lvs集群开发出来的&#xff0c;但是适用场景不仅仅局限于lvs。而且keepalive为后台的真实服务器做了一个健康检查&#xff0c;当服务不可用时&#xff0c;会自动的移除ipvs的转发策略&#xff0c;服务恢复时&…...

HTTP 协议报文结构 | 返回状态码详解

注&#xff1a;本文为 “HTTP 历史 | 协议报文结构 | 返回状态码” 相关文章合辑。 未整理去重。 HTTP 历史 wangjunliang 最后更新: 2024/3/16 上午10:29 超文本传输协议(英语:HyperTextTransferProtocol,缩写:HTTP)是 万维网(World Wide Web)的基础协议&#xff61;自 蒂姆…...

如何保证开源AI呼入机器人和AI呼出机器人的服务质量?

如何保证开源AI呼入机器人和AI呼出机器人的服务质量&#xff1f; 确保开源AI呼入机器人和AI呼出机器人的服务质量是企业成功部署这些智能系统的关键。高质量的服务不仅能够提高客户满意度&#xff0c;还能增强企业的市场竞争力。以下是实现这一目标的几个关键策略和技术措施&a…...

C++day7

#include <iostream>using namespace std; template <class T> class mylist{ public:struct Link{T val;Link* next;Link* front;};//增void insert(T val);//删void remove(T val);//改mylist& operator[](int index);//排序void Sort();//遍历void show();/…...

docker搭建Redis集群及哨兵(windows10环境,OSS Cluster)

一、基本概念 Redis:即 "Remote DIctionary Server" &#xff0c;翻译为“远程字典服务器”。从字面意义上讲&#xff0c;它指的是一个远程的字典服务&#xff0c;意味着它是一个可以远程访问的服务&#xff0c;主要用于存储键值对&#xff08;key-value pairs&…...

第8章 搬移特性

8.1 搬移函数 模块化是优秀软件设计的核心所在&#xff0c;好的模块化能够让我在修改程序时只需理解程序的一小部分。为了设计出高度模块化的程序&#xff0c;我得保证互相关联的软件要素都能集中到一块&#xff0c;并确保块与块之间的联系易于查找、直观易懂。同时&#xff0c…...

[IT项目管理]项目时间管理(本章节3w字爆肝)

七.项目时间管理 7.1 项目进度的重要性 为什么要重视项目进度&#xff1a;在项目进行的过程之中会遇到变故。但是不论项目中发生了什么&#xff0c;时间总是在流逝&#xff0c;就可能会导致项目不可以在规定的时间完成。 7.2可能影响项目进度的因素 有员工离职个人的工作方…...

k8s中设置annotation的方法总结

k8s中设置annotation的方法总结 annotation是什么 在 Kubernetes 中&#xff0c;Annotations 是一种用于向 Kubernetes 对象附加非标识性元数据的机制。 annotation有什么用 annotation与 Labels 类似&#xff0c;但有一些关键区别和特定用途。 常用于存储与对象相关的配置…...

第19天:信息收集-Web应用源码获取闭源备份开发泄漏WebPack打包资源搜索ICO定位

#知识点 1、信息收集-Web应用-源码获取-已知指纹&未知指纹 2、信息收集-Web应用-源码获取-泄漏问题&发现指纹 一、参考文章&#xff1a; https://www.secpulse.com/archives/124398.html https://mp.weixin.qq.com/s/QgLDdaefXlZtvlSiFQShZw 二、源码泄漏原因&#xff…...

uniapp小程序的锚点定位(将页面滚动到目标位置)

小程序中&#xff0c;a页面跳转到b页面&#xff0c;跳转后滚动定位到b页面的特定位置。 1.uni.pageScrollTo传递一个scrollTop参数可以滚动到特定位置。2.可以通过 uni.createSelectorQuery()等获取定位元素的位置信息。3.uni.getSystemInfoSync()获取设备的导航栏和状态栏高度…...

py脚本部署到服务器定时启动

py脚本部署到服务器定时启动 一、准备好你的脚本二、把脚本放到服务器三、在服务器创建脚本所需要的环境1、安装 Miniconda&#xff08;如果不想安装 Anaconda 或 Miniconda&#xff0c;可以直接使用 Python 的venv模块创建虚拟环境&#xff0c;但安装 Conda 会更方便管理不同版…...

相机不动,机构动作----Hands Eyes

最近在研究 手眼标定&#xff0c;发现大家都需付费&#xff0c;搞啥子&#xff0c;说好的开源。。。 以相机在上固定不动&#xff0c;机械手为 EPSON_Robot 为例&#xff0c;详细的一步一步实例操作指引 EPSON_Robot 的192.168.0.1 2004 Server 详细操作步骤 1. 启动程序 运…...

Jdk1.7到Jdk1.8 HashMap 发生了什么变化(底层)

从JDK 1.7到JDK 1.8&#xff0c;HashMap在底层实现上发生了显著的变化&#xff0c; 主要体现在数据结构、链表插入方式、哈希算法、扩容机制以及并发性方面。 以下是具体的变化点&#xff1a; 1. 数据结构的变化 JDK 1.7&#xff1a;HashMap的底层数据结构是数组单向链表。…...

微积分复习笔记 Calculus Volume 2 - 4.2 Direction Fields and Numerical Methods

4.2 Direction Fields and Numerical Methods - Calculus Volume 2 | OpenStax...

java后端环境配置

因为现在升学了&#xff0c;以前本来想毕业干java的&#xff0c;很多java的环境配置早就忘掉了&#xff08;比如mysql maven jdk idea&#xff09;&#xff0c;想写个博客记录下来&#xff0c;以后方便自己快速搭建环境 JAVA后端开发配置 环境配置jdkideamavenMySQLnavicate17…...

Unity UI Button 事件优先级调整技术方案

Unity UI Button 事件优先级调整技术方案 在 Unity 项目开发过程中&#xff0c;针对 UI Button 的事件执行顺序控制是一个常见需求。本文详细阐述两种将新添加事件置于第一个执行位置的方法&#xff0c;旨在为开发者提供全面且专业的技术参考。 一、基于反射机制的事件插入方…...

【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string

文章目录 知识回顾一、栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢&#xff1f;值类型引用类型 2、总结 三、特殊的引用类…...

PHP排序算法:数组内有A~E,A移到C或者C移到B后排序,还按原顺序排序,循环

效果 PHP代码 public function demo($params){function moveNext($arr){$length count($arr);$lastElement $arr[$length - 1];for ($i $length - 1; $i > 0; $i--) {$arr[$i] $arr[$i - 1];}$arr[0] $lastElement;return $arr;}function moveAndReplace($array, $from…...

keepalived的高可用集群

keepalived的概念 keepalived的工作原理 基于vrrp实现的调度器高可用方案 keepalived的配置实验 先在调度服务器上安装keepalived和ipvsadm apt -y install keepalived ipvsadm 复制keepalived的配置文件到/etc/keepalived/目录下 cp /usr/share/doc/keepalived/samples/keep…...

基于单片机的农田灌溉系统(论文+源码)

1.系统设计 本系统主要实现如下目标&#xff1a; 1&#xff0e;可以实时监测土壤湿度&#xff1b; 2&#xff0e;土壤湿度太低时&#xff0c;进行浇水操作&#xff1b; 3&#xff0e;可以按键设置湿度的触发阈值&#xff1b; 4. 可以实现远程操控 5&#xff0e;可以实现手…...

技术文档分享——绘制精准航海图:技术文档规划、表达与维护的艺术

绘制精准航海图&#xff1a;技术文档规划、表达与维护的艺术 方向一&#xff1a;技术文档的规划布局从技术文档的规划布局入手&#xff0c;探讨如何确定文档的整体架构&#xff0c;如章节设置、逻辑顺序等&#xff0c;以确保信息呈现的系统性与连贯性。1. 确定文档的目标和读者…...

43124123

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…...

Pytorch应用实战(1)- 基于YOLO的视频人脸马赛克处理

免费链接: Blogger(需翻Q), Github 文章目录 本文介绍给图片的人脸打码给视频的人脸打码本文介绍 YoloV11(Github)提供了非常方便的API帮助用户实现目标检测(detect)、语义分割(segement)、肢体识别(Pose)等功能。 本文将基于YoloV11的目标检测来实现一个视频人脸马…...

【Prompt Engineering】1.编写 Prompt 的原则

一、环境配置 使用 OpenAI 的 ChatGPT API&#xff0c;需要有 API_KEY&#xff0c;并安装 OpenAI 库。安装命令&#xff1a;pip install openai 和 pip install zhipuai。配置方法&#xff1a;直接设置 openai.api_key 或通过环境变量设置。 二、两个基本原则 2.1 原则一&am…...

非vip版opengl

环境搭建 安装编译器和构建工具&#xff1a;在 Windows 上可以使用 Visual Studio&#xff0c;在 Linux 上可以使用 GCC 等编译器。确保编译器已正确安装并配置好环境变量。安装 OpenGL 库和相关辅助库&#xff08;以 GLUT 为例&#xff09;&#xff1a; Windows&#xff1a; 下…...

【深入理解Nginx】

深入理解Nginx 介绍 Nginx&#xff08;发音为 “engine-x”&#xff09;是一款高性能的HTTP服务器和反向代理服务器&#xff0c;同时支持IMAP/POP3协议。它以其高并发处理能力、稳定性、丰富的功能集、简单的配置和低资源消耗而受到广泛欢迎。Nginx特别适合提供静态文件服务、…...

番外篇 | Hyper-YOLO:超图计算与YOLO架构相结合成为目标检测新的SOTA !

前言:Hello大家好,我是小哥谈。Hyper-YOLO,该方法融合了超图计算以捕捉视觉特征之间复杂的高阶关联。传统的YOLO模型虽然功能强大,但其颈部设计存在局限性,限制了跨层特征的融合以及高阶特征关系的利用。Hyper-YOLO在骨干和颈部的联合增强下,成为一个突破性的架构。在COC…...

Microi吾码|开源低代码.NET、VUE低代码项目,表单引擎介绍

Microi吾码&#xff5c;开源低代码.NET、VUE低代码项目&#xff0c;表单引擎介绍 一、摘要二、Microi吾码介绍2.1 功能介绍2.2 团队介绍2.3 上线项目案例 三、Microi吾码表单引擎是什么&#xff1f;四、Microi吾码表单引擎功能4.1 模块引擎 - 由表单引擎驱动4.2 流程引擎 - 由表…...

css常用属性有哪些

在上篇文章我们知道了利用css选择器来对HTML进行简单装饰&#xff0c;就像做word文档一样&#xff0c;需要对哪一段落修改格式&#xff0c;就需要先选中&#xff0c;css选择器就是这意思。这格式如何修改&#xff0c;怎么放大字体&#xff0c;怎么加粗&#xff0c;怎么修改背景…...

Java设计模式 —— 【结构型模式】装饰者模式详解

文章目录 前言结构说明案例演示小结静态代理和装饰者的区别 前言 在日常生活中&#xff0c;我们常会遇到一种场景&#xff1a;去快餐店吃饭&#xff0c;里面琳琅满目的主食&#xff0c;还有各式各样的配菜作为消费者&#xff0c;只管挑选就行&#xff0c;但是如果让我们来设计…...

简道云与金蝶云星空无缝集成的技术探索

简道云数据集成到金蝶云星空的技术案例分享 在企业信息化建设中&#xff0c;数据的高效流动和准确对接是关键环节。本文将聚焦于一个实际运行的系统对接集成案例&#xff1a;简道云-其他入库单--->金蝶-其他入库单&#xff0c;通过轻易云数据集成平台实现这一目标。 案例背…...

单片机原理及应用笔记:单片机中断系统原理与项目实践

高金鹏&#xff1a;男&#xff0c;银川科技学院计算机与人工智能学院&#xff0c;2022级别计算机科学与技术本科生&#xff0c;单片机原理及应用课程第六组。 指导教师&#xff1a;王兴泽 电子邮件&#xff1a;高金鹏3535558665qq.com 个人CSDN:暴躁的海绵宝宝 暴躁的海绵宝…...

uniapp使用百度地图配置了key,但是显示Map key not configured

搞了我两天的一个问题。 hbuilderx版本&#xff1a;4.36 问题介绍&#xff1a; 我的项目是公司的项目&#xff0c;需要在H5端使用百度地图&#xff0c;使用vue-cli创建的uniapp&#xff0c;就是uni代码在src里的目录结构。就是使用这种方式才会遇到这个问题。 问题原因&#xf…...

CTFHub ssrf

第一关&#xff08;内网访问&#xff09; 尝试访问位于127.0.0.1的flag.php吧 第二关(伪协议读取文件) 尝试去读取一下Web目录下的flag.php吧 1.首先尝试http://127.0.0.1/flag.php 2.查看页面源代码 3.根据提示输入file:///var/www/html/flag.php 4.查看页面源代码 第三关&…...

字符串哈希

1. LC 3292 形成目标字符串需要的最少字符串数Ⅱ 这题在3291的基础上开大数据量了。 3291我是比较标准的dp字典树优化匹配。先把所有word扔到字典树里面&#xff0c;定义dp[i]表示到target[i]需要的最少次数。对于每个i进行target子串的最长前缀匹配&#xff0c;随后向后刷表…...

ensp 静态路由配置

A公司有广州总部、重庆分部和深圳分部3个办公地点&#xff0c;各分部与总部之间使用路由器互联。广州、重庆、深圳的路由器分别为R1、R2、R3&#xff0c;为路由器配置静态路由&#xff0c;使所有计算机能够互相访问&#xff0c;实训拓扑图如图所示 绘制拓扑图 给pc机配置ip地址…...

Android Room 数据库使用详解

一、Room介绍 Android Room 是 Google 提供的一个 Android 数据持久化库&#xff0c;是 Android Jetpack 组成部分之一。它提供了一个抽象层&#xff0c;使得 SQLite 数据库的使用更为便捷。通过 Room&#xff0c;开发者可以轻松地操作数据库&#xff0c;不需要直接编写繁琐的…...

Ubuntu安装或卸载mariadb-server软件包

1、安装mariadb-server sudo apt install mariadb-server 检查MariaDB服务器的服务状态 service mariadb status 仅需要卸载MariaDB&#xff0c;而不是删除所有MariaDB相关软件包 sudo apt-get remove mariadb-server 2、卸载MariaDB 从系统中完全删除MariaDB数据库&#xf…...

canal详解及demo

提示&#xff1a;如何保证Redis中的数据与数据库中的数据一致性&#xff1f;数据同步canal的介绍和demo、大型企业如何实现mysql到redis的同步&#xff1f;使用binlog实时更新redis缓存、canal的接入教程、win下canal的服务器端、canal客户端的创建、连接、测试教程、数据同步方…...

SQL语句

SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是用于管理和操作关系数据库系统的标准编程语言。它允许用户执行数据的定义、查询、更新和管理等操作。以下是一些常见的SQL语句及其简要说明&#xff1a; 数据定义语言&#xff08;DDL&#…...

中间件 redis安装

redis官网地址&#xff1a;Redis - The Real-time Data Platform 环境 CentOS Linux release 7.9.2009 (Core) java version "17.0.12" 2024-07-16 LTS 1、通过压缩包安装redis 1&#xff0c;远程下载redis压缩包&#xff0c;或去官网下载&#xff1a;Downloads …...

设计模式12:抽象工厂模式

系列总链接&#xff1a;《大话设计模式》学习记录_net 大话设计-CSDN博客 参考&#xff1a; C设计模式&#xff1a;抽象工厂模式&#xff08;风格切换案例&#xff09;_c 抽象工厂-CSDN博客 1.概念 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是软件设计…...

学习笔记:从ncsi/nc-si协议和代码了解网络协议的设计范式

学习笔记&#xff1a;从ncsi/nc-si协议和代码了解网络协议的设计范式 参考文档&#xff1a; https://www.dmtf.org/standards/published_documents https://www.dmtf.org/dsp/DSP0222 https://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.2.0.pdf参考代…...

基础库urllib的使用

学习爬虫&#xff0c;其基本的操作便是模拟浏览器向服务器发出请求&#xff0c;那么我们需要从哪个地方做起呢?请求需要我们自己构造吗?我们需要关心请求这个数据结构怎么实现吗?需要了解 HTTP、TCP、IP层的网络传输通信吗?需要知道服务器如何响应以及响应的原理吗? 可能…...

SSM 电脑配件销售系统设计要点与 JSP 实现难点攻克

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于电脑配件销售系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了电脑配件销售系统&#xff0c;它彻底改变了过…...

AI前沿分析:ChatGPT搜索上线,Google搜索地位能否守住?

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 引言:AI与搜索领域的激烈博弈一、ChatGPT搜索的优势是什么?1. 实时信息获取:超越传统搜索2. 对话式搜索:重构用户体验3. 个性化推荐:深度挖掘用户需求二、G…...

单片机:实现utf-8转gb2312(附带源码)

单片机实现UTF-8转GB2312 在嵌入式系统中&#xff0c;字符编码是常见的问题之一&#xff0c;尤其是在显示中文字符时。UTF-8和GB2312都是常见的字符编码标准&#xff0c;UTF-8广泛用于Web和现代操作系统中&#xff0c;而GB2312是中国大陆常用的中文字符集。在一些嵌入式系统中…...

VMProtect:软件保护与安全的全面解决方案

在当今数字化时代&#xff0c;软件的安全性和保密性愈发重要。VMProtect 作为一款备受瞩目的软件保护工具&#xff0c;因其强大的功能和广泛的应用而成为开发者保护软件的首选方案。 VMProtect 是一款新一代的软件保护实用程序&#xff0c;支持多个编译器平台&#xff0c;包括…...

linux下观察进程捕获信号的情况

linux观察进程收到信号的情况&#xff0c;信号可以来自外部进程、进程自身、内核定时器等。 观察捕获信号方法一&#xff1a;strace strace所有信号&#xff1a; strace -e signal -f -p $pid 过滤出某个信号&#xff1a; #grep 信号名&#xff0c;取自kill -l strace -e …...