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

STL算法之其它算法_下

random_shuffle

        这个算法将[first,last)的元素次序随机排列。也就说,在N!中可能的元素排列中随机选出一种,此处N为last-first。

        N个元素的序列,其排列方式为N!中,random_shuffle会产生一个均匀分布,因此任何一个排列被选中的几率为1/N!。这很重要(稍后看源码,事实上依赖于随机数是否真随机),因为有不少算法可能会依赖排列的随机性。

        其算法实现过程,基本也是依次对每个元素进行随机的替换,以实现随机排列的功能。代码如下:

// SGI 版本一
template <class RandomAccessItertor>
inline void random_shuffle(RandomAccessItertor first, RandomAccessItertor last) {__random_shuffle(first, last, distance_type(first));
}template <class RandomAccessItertor, class Distance>
void __random_shuffle(RandomAccessItertor first, RandomAccessItertor last, Distance *) {if (first == last) return ;for (RandomAccessItertor I = first; I != last; ++I) #ifdef __STL_NO_DRAND48iter_swap(i, first + Distance(rand() % ((I - first) + 1)));#elseiter_swap(i, first + Distance(lrand48() % ((I - first) + 1)));#endif
} // SGI 版本二
template <class RandomAccessItertor, class RandomNumberGenerator>
void random_shuffle(RandomAccessItertor first, RandomAccessItertor last, RandomNumberGenerator& rand) {if (first == last) return ;for (RandomAccessItertor I = first; I != last; ++I) iter_swap(i, first + rand((I - first) + 1);
} 

从以上代码不难看出random_shuffle第一个版本会使用到内置的rand()函数,我们不难验证如果我们不调用srand函数指定随机数种子,会导致每次调用的结果是相同的序列依次出现。

测试代码如下:

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;template<class T>
struct display
{void operator() (const T &x) {cout << x << " ";}
};int main() {int ia[] = {0, 1, 2,3, 4, 5, 6,7};vector<int> iv(ia , ia+8);srand(time(NULL));for (int i = 0; i < 10; ++i) {random_shuffle(iv.begin(), iv.end());for_each(iv.begin(), iv.end(), display<int>());cout << endl;}return 0;
}

如果将上述代码中的srand(time(NULL))删除,会发现每次运行的结果都是一样的。

partial_sort/partial_sort_copy

        本算法接受一个middle迭代器(位于序列[first,last)之内),然后重新安排[first, last),使序列中的middle-first个最小元素以递增顺序排序,置于[first,middle)内。其余last-middle个元素安置于[middle,last)中,不保证有任何特定顺序。

        使用sort算法,同样能够保证较小的N个元素以递增顺序置于[first, first+N)之内。选择partial_sort而非sort的唯一理由是效率。是的,如果只是跳出前N个最小元素排序,当然比对整个序列排序快上很多。

        partial_sort有两个版本;区别在于第二个版本会提供反函数comp替代默认的less-than操作符。算法内部采用heap sort来完成任务,简述如下。

        partial_sort的任务是找出middle-first个最小元素,因此,首先界定出区间[first, middle),并利用STL序列式容器之heap(堆)_heap stl-CSDN博客中的make_heap()将它组织为max-heap,然后将[middle,last)中的元素拿来与max-heap中的最大值比较(max-heap的最大值就在第一个元素上,轻松可获得);如果小于该最大值,就互换位置并重新保持max-heap状态。如此一来,当我们走遍整个[middle,last)时,较大的元素都已经被剥离出[first,middle),这时候再以sort_heap()将[first,middle)做一次排序,即可完成算法的述求。下图描述详情:

        下面是partial_sort的实现细节。

// 版本一
template <class RandoemAccessIterator>
inline void partial_sort(RandoemAccessIterator first, RandoemAccessIterator middle, RandoemAccessIterator last) {__partial_sort(first, middle, last, value_type(first));
}template <class RandoemAccessIterator, class T>
void __partial_sort(RandoemAccessIterator first, RandoemAccessIterator middle, RandoemAccessIterator last, T*) {make_heap(first, middle);for (RandoemAccessIterator I = middle; I < last; ++I) if (*I < *first) __pop_heap(first, middle, I, T(*I), distance_type(first));sort_heap(first, middle);
}

        partial_sort有一个姊妹,就是partial_sort_copy,partial_sort和partial_sort_copy两者行为逻辑完全相同,只不过后者将(last-first)个最小元素排序后的所得结果至于[result_first, result_last)。

sort

        此节内容可阅读STL算法之sort-CSDN博客

equal_range

        算法equal_range是二分查找法的一个版本,试图在已排序的[first,last)中寻找value。它返回一对迭代器i和j,其中i是在不破坏次序的前提下,value可插入的第一个位置(亦即lower_bound),j则是不破坏次序的前提下,value可插入的最后一个位置(亦即upper_bound)。因此,[i,j)内的每个元素都等同于value,而且[i,j)是[first, last)之中符合此性质的最大子区间。

        如果以稍许不同的角度思考equal_range,我们可以把它想成是[first, last)内“与value等同”之所有元素所形成的区间A。由于[first, last)有序,所以我们知道“与value等同”之所有元素一定相邻。于是,算法lower_bound返回区间A的第一个迭代器,算法upper_bound返回区间A的最后一个元素的下一个位置,算法equal_range则是以pair的形式将两者返回。

        即使[first, last)并未含有“与value等同”之任何元素,以上叙述仍然合理。这种情况下“与value等同”之所有元素所形成的,其实是个空区间。在不破坏次序的前提下,只有一个位置可以插入value,而equal_range所返回的pair,其第一和第二元素皆指向该位置。

        本算法有两个版本一个是使用operator<进行比较,第二版本采用仿函数comp进行比较。代码如下:

// 版本一
template<class ForwardIterator, class T>
inline pair< ForwardIterator, ForwardIterator>
equal_range(ForwardIterator first, ForwardIterator last, const T& value) {return __equal_range(first, last, value, distance_type(first), iterator_category(first));
}// 版本一的random_access_iterator_tag版本
template<class RandomAccessIterator, class T, class Distance>
pair< RandomAccessIterator, RandomAccessIterator >
__equal_range(RandomAccessIterator first, RandomAccessIterator last, const T& value, Distance*, random_access_iterator_tag) {Distance len = last - first;Distance half;RandomAccessIterator middle, left, right;while (len > 0) {half = len >> 1;middle = first + half;if (*middle < value) {first = middle + 1;len = len - half - 1;} else if (value < *middle) {len = half;} else {left = lower_bound(first, middle, value);right = upper_bound(++middle, first + len, value);return pair< RandomAccessIterator, RandomAccessIterator>(left, right);}}// 未找到相等的元素,返回一对迭代器,指向第一个大于value的元素return pair< RandomAccessIterator, RandomAccessIterator>(first, first);
}// 版本一的forward_iterator_tag版本
template<class ForwardIterator, class T, class Distance>
pair< ForwardIterator, ForwardIterator >
__equal_range(ForwardIterator first, ForwardIterator last, const T& value, Distance*, random_access_iterator_tag) {Distance len = last - first;Distance half;ForwardIterator middle, left, right;while (len > 0) {half = len >> 1;middle = first;advance(middle, half);if (*middle < value) {first = middle;++first;len = len - half - 1;} else if (value < *middle) {len = half;} else {left = lower_bound(first, middle, value);advance(first, len);right = upper_bound(++middle, first , value);return pair< ForwardIterator, ForwardIterator>(left, right);}}return pair< ForwardIterator, ForwardIterator>(first, first);
}

inplace_merge(应用于有序区间)

        如果两个连接在一起的序列[first, middle)和[middle, last)都以排序,那么inplace_merge可将他们结合成单一一个序列,并仍保有序性。如果原先两个序列式递增排序,执行结果也会是递增排序,如果原先两个时递减排序,执行结果也是递减排序。

        和merge一样,inplace_merge也是一种稳定操作。每个作为数据来源的子序列中的元素先对次序都不会变动;如果两个子序列有等同的元素,第一个序列的元素会排在第二个序列元素之前。

        implace_merge有两个版本,其差别在于使用operator<还是仿函数comp。以下是代码:

template<class BidrectionalIterator>
inline void inplace_merge(BidrectionalIterator first, BidrectionalIterator middle, BidrectionalIterator last) {if (first == middle || middle == last) return ;__inplace_merge_aux(first, middle, last, value_type(first), distance_type(first));
}// 辅助函数
template<class BidrectionalIterator, class T, class Distance>
inline void __inplace_merge_aux(BidrectionalIterator first, BidrectionalIterator middle, BidrectionalIterator last, T*, Distance*) {Distance len1 = 0;distance(first, middle, len1);Distance len2 = 0;distance(middle, last, len2);// 注意,本算法会使用额外的内存空间(暂时缓冲区)temporary_buffer<BidrectionalIterator, T> buf(first, last);if (buf.begin() == 0) __merge_without_buffer(first, middle, last, len1, lend2);else __merge_adaptive(first, middle, last, len1, len2, buf.begin(), Distance(buf.size()));}

        这个算法如果有额外的内存辅助,效率会好许多。鉴于篇幅,我们主要关注有缓冲区的情况。

// 辅助函数
template <class BidirectionalIterator, class Distance, class Pointer>
void __merge_adaptive(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Distance len1, Distance len2, Pointer buffer, Distance buffer_size) {if (len1 <= len2 && len1 <= buffer_size) {// case 1.缓冲区足够安置序列一Pointer end_buffer = copy(first, middle, buffer);merge(buffer, end_buffer, middle, last, first);} else (len2 <= buffer_size) {// case 2.缓冲区足够安装序列二Pointer end_buffer = copy(middle, last buffer);__merge_backward(first, middle, buffer, end_buffer, last);} else { // case 3. 缓冲区空间不足以安置任何一个序列BidirectionalIterator first_cut = first;BidirectionalIterator second_cut = middle;Distance len11 = 0;Distance len22 = 0;if (len1 > len2) {len11 = len1 / 2;advance(first_cut, len11);second_cut = lower_bound(middle, last, *first_cut);distance(middle, second_cut, len22);} else {len22 = len2 / 2;advance(second_cut, len22);first_cut = upper_bound(first, middle, *second_cut);distance(first, first_cut, len11);}BidirectionalIterator new_middle = __rotate_adaptive(first_cut, middle, second_cut, len1 - len11, len22, buffer, buffer_size);//针对左段,递归调用__merge_adaptive(first_cut, middle, second_cut, len1 - len11, len22, buffer, buffer_size);//针对右段,递归调用__merge_adaptive(new_middle, second_cut, last, second_cut, len1 - len11, len2 - len22, buffer, buffer_size);}
}

        上述辅助函数首先判断缓冲区是否足以容纳inplace_merge所接受的两个序列的任何一个。如果空间充裕,工作逻辑很简单:把两个序列中的某个copy到缓冲区,在使用merge完成余下工作。是的,merge足堪胜任,它的功能就是将两个有序但分离的区间合并,形成一个有序区间,依次只需将merge的结果置放处result指定为inplace_merge所接受序列起始点(迭代器first)即可。其余情况使用递归逐渐减少对缓存的使用以达到合并的目的。更详细内容可在STL算法之merge sort-CSDN博客进行查看。

nth_element

        这个算法会重新排列[first, last),是迭代器nth所指的元素,与“整个[first, last)完整排列后,同一位置的元素”同值。此外并保证[nth, last)内没有任何一个元素小于(更精确地说是不大于)[first, nth)内的元素,但对于[first, nth)和[nth, last)两个子区间内的元素次序则无任何保证--这一点也是它与partial_sort很大的不同之处。以此观之,neth_element比较近似partition而非sort或partial_sort.

        例如,假设序列{22,30,30,17,33,40,17,23,22,12,20},以下操作

neth(iv.begin(), iv.begin() + 5, iv.end());便是将小于*(iv.being()+5)(本例40)的元素置于该元素之左,其余置于该元素之右,并且不保证维持原有的相对位置。获得的结果为{20,12,22,17,17,22,23,30,30,33,40}。执行完毕后的5^{th}位置上的元素值22,与整个序列完整排序后{12,17,17,20,22,22,23,30,30,33,40}的5^{th}个位置上的元素值相同。

        如果以上述结果{20,12,22,17,17,22,23,30,30,33,40}为根据,在执行以下操作:

        nth_element(iv.begin(), iv.begin() + 5, iv.end(), greater<int>());那便是将大于*(iv.being()+5)(本例22)的元素置于该元素值左,其余置于该元素之右,并且不保证位置原有的相对位置,获得的结果为{40,33,3030,23,22,17,17,22,12,20}.

        由于nth_element比partial_sort的保证更少,所以它当然比partial_sort较快。

        nth_element只接受RandomAccessIterator。

        nth_element的做法是,不断地以median-of-3 partition(以首、尾、中央三点中值为枢轴之分割法)将整个序列分割为更小的L,R子序列。如果nth迭代器落于左子序列,就再对左子序列进行分割,否则就再对右子序列进行分割。依次类推,直到分割后的子序列不大于3,便对最后这个待分割的子序列左Insertion Sort,大功告成。

代码如下:

template <class RandomAccessIterator>
inline void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last) {__nth_element(first, nth, last, value_type(first));
}template <class RandomAccessIterator, class T>
void __nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, T*) {while (last - first > 3) {RandomAccessIterator cut = __unguarded_partition(first, last, T(__median(*first, *(first + (last - first)/2), *(last -1));if (cut < nth) first = cut;else last = cut;}__insertion_sort(first, last);
}

操作示例如下:

其中第一步是通过*first,*(last-1),及*(first+ (last-first)/2),三个数的中位数作为,partitiion的pivot,第一轮pivot位22。替换后为第二行的结果;此时得到cut为5,指向40,比nth=4来得大,所有在左半段继续进行partition,选择17进行partition,得到3号位,22为新的cut,更新first后,last-first=2,可以对{22,20}进行排序,排序后,4号位为22,即为我们想要的结果。22即为整个序列最终排好序后的第4个数

参考文档《STL源码剖析》---侯捷

相关文章:

STL算法之其它算法_下

random_shuffle 这个算法将[first,last)的元素次序随机排列。也就说&#xff0c;在N!中可能的元素排列中随机选出一种&#xff0c;此处N为last-first。 N个元素的序列&#xff0c;其排列方式为N!中&#xff0c;random_shuffle会产生一个均匀分布&#xff0c;因此任何一个排列被…...

MySQL如何区分幻读和不可重复读

在MySQL中&#xff0c;幻读和不可重复读都是并发事务中可能出现的问题&#xff0c;但它们的表现和原因略有不同。 不可重复读 (Non-Repeatable Read) 不可重复读是指在同一个事务内&#xff0c;多次读取同一行数据时&#xff0c;可能会得到不同的结果。这种情况发生在一个事务…...

html ul li 首页渲染多条数据 但只展示八条,其余的数据全部隐藏,通过icon图标 进行展示

<div style"float: left;" id"showMore"> 展开 </div> <div style"float: left;“id"hideLess"> 收起 </div> var data document.querySelectorAll(.allbox .item h3 a); const list document.querySelectorAl…...

Vue3安装 运行教程

本文是综合了所有vue安装教程而成 更细化 更简略 希望对各位读者有所帮助&#xff01; Vue安装 1. Vue-cli脚手架安装 安装vue的方式有很多 我们这里选择npm方式安装vue npm方式 npm方式安装vue&#xff0c;详细介绍见下文。 1.node.js安装和配置 安装npm 需要安装note.js&…...

Spring事务的一道面试题

每次聊起Spring事务&#xff0c;好像很熟悉&#xff0c;又好像很陌生。本篇通过一道面试题和一些实践&#xff0c;来拆解几个Spring事务的常见坑点。 原理 Spring事务的原理是&#xff1a;通过AOP切面的方式实现的&#xff0c;也就是通过代理模式去实现事务增强。 具体过程是&a…...

PHP SM4 加密

PHP SM4 加密 sm4基类 class Sm4 {private $ck [0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,0xc0c7ced5, 0xdce3ea…...

群控系统服务端开发模式-应用开发-短信工厂腾讯云短信开发

一、腾讯云短信工厂开发 1、添加框架对应的SDK composer require tencentcloud/tencentcloud-sdk-php 2、添加腾讯云工厂 在根目录下extend文件夹下Sms文件夹下channel文件夹下&#xff0c;创建腾讯云短信发送工厂并命名为TencentSmsSender。记住&#xff0c;一定要在腾讯云短…...

vue key属性强制刷新组件

在 Vue 中&#xff0c;key 属性通常用来帮助 Vue 跟踪每个组件或元素的身份&#xff0c;尤其是在使用 v-for 渲染列表时。当 key 值发生变化时&#xff0c;Vue 会销毁并重新渲染组件&#xff0c;这也可以用于强制刷新组件。 如果你想强制刷新一个组件&#xff0c;可以通过动态…...

浪潮X86服务器NF5280、8480、5468、5270使用inter VROC Raid key给NVME磁盘做阵列

浪潮服务器inter VROC Raid key给NVME磁盘做阵列方法 Inter VROC技术简介Raid Key 授权&#xff0c;即VROC SKU兼容性处理器兼容性列表平台和芯片组兼容性列表各Raid级别最大磁盘数量硬盘型号操作系统 服务器上的操作安装Raid Key确认服务器能识别硬盘识别磁盘所在的通道及服务…...

最长最短单词

最长最短单词 C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入1行句子&#xff08;不多于200个单词&#xff0c;每个单词长度不超过100&#xff09;&#xff0c;只包含字母、空格和逗号。单词由至少一…...

Muduo网络库剖析 --- 架构设计

文章目录 前言概述篇一、Muduo网络库简介Reactor事件处理模式 二、基于muduo实现简易聊天服务器实现测试运行 三、muduo的架构设计Reacor模式muduo框架架构解析主从Reactor工作流程主线程(main Reactor)工作线程(sub Reactor) 线程分配与负载均衡 四、总结线程分配与负载均衡 四…...

lwip raw、netcoon、socket三种接口编程的区别

目录 一、前言 二、LWIP 简介 三、LWIP RAW 编程 1.概念与原理 2.编程模型与流程 3.示例代码 4.优点与缺点 四、LWIP NETCONN 编程 1.概念与原理 2.编程模型与流程 3.示例代码 4.优点与缺点 五、LWIP SOCKET 编程 1.概念与原理 2.编程模型与流程 3.示例代码 …...

在办公室环境中用HMD替代传统显示器的优势

VR头戴式显示器&#xff08;HMD&#xff09;是进入虚拟现实环境的一把钥匙&#xff0c;拥有HMD的您将能够在虚拟现实世界中尽情探索未知领域&#xff0c;正如如今的互联网一样&#xff0c;虚拟现实环境能够为您提供现实中无法实现的或不可能实现的事。随着技术的不断进步&#…...

P3916 图的遍历(Tarjan缩点和反向建边)

P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 写法一&#xff1a;Tarjan 思路&#xff1a;先运用Tarjan算法得到每个连通块中最大的编号&#xff0c;然后对每个连通块进行缩点重新建图&#xff0c;进行dfs&#xff0c;得到缩点后的连通块能够达到的最大编号。 Code: conste…...

Element UI 的 el-tree 组件e中默认展开前两层,设置 default-expanded-keys 属性来实现

在使用 Element UI 的 el-tree 组件时&#xff0c;如果你希望默认展开树的前两层节点&#xff0c;可以通过设置 default-expanded-keys 属性来实现。这个属性接受一个数组&#xff0c;数组中的值是需要默认展开的节点的 key。 首先&#xff0c;你需要确保你的每个树节点都有唯…...

Vue 项目中未登录状态如何统一处理

在 Vue 项目中&#xff0c;处理未登录状态&#xff08;比如用户访问需要登录的页面时&#xff09;是一项常见的需求。为了实现这一需求&#xff0c;我们通常使用 Vue Router 配合 Vuex 或者 Vue 的全局状态管理来统一处理未登录的状态&#xff0c;确保用户只能访问允许的页面。…...

Java 集合:强大的数据管理工具

在 Java 编程中&#xff0c;集合是一种非常重要的工具&#xff0c;它提供了一种方便的方式来存储和操作一组对象。本文将深入探讨 Java 集合框架&#xff0c;包括其主要类型、特点、用法以及一些最佳实践。 一、引言 在软件开发过程中&#xff0c;我们经常需要处理一组数据。…...

Creating Server TCP listening socket *:6379: bind: No error

启动redis报错&#xff1a;Creating Server TCP listening socket *:6379: bind: No error 解决方案&#xff1a; 1、直接在命令行中输入 redis-cli.exe 2、输入shutdown&#xff0c;关闭 3、输exit&#xff0c;退出 4、重新输入 redis-server.exe redis.windows.conf&…...

iOS免费共享企业证书、苹果最新企业证书免费获取

前言 大家可能都注意到了&#xff0c;苹果手机和安卓手机在安装软件上有点不一样。如果你在苹果手机上想装那些没在官方商店&#xff08;App Store&#xff09;里的软件&#xff0c;那就得给它们“签个名”&#xff0c;就像是给它们盖个章&#xff0c;这样手机才能认识它们&am…...

如果用Python写爬虫,具体怎么实现随机请求间隔呢?

在Python中实现随机请求间隔&#xff0c;通常使用time.sleep()函数结合random模块来生成随机的等待时间。以下是一个具体的实现方法&#xff1a; 导入必要的模块 首先&#xff0c;你需要导入time和random模块&#xff1a; import time import random 设置随机间隔 然后&am…...

aws(学习笔记第十五课) 如何从灾难中恢复(recover)

aws(学习笔记第十五课) 如何从灾难中恢复 学习内容&#xff1a; 使用CloudWatch对服务器进行监视与恢复区域(region)&#xff0c;可用区(available zone)和子网(subnet)使用自动扩展(AutoScalingGroup) 1. 使用CloudWatch对服务器进行监视与恢复 整体架构 这里模拟Jenkins Se…...

nginx4层限速

Nginx的功能概述 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也可以作为邮件代理服务器等。它主要工作在7层&#xff08;应用层&#xff09;&#xff0c;但在某些场景下也可以实现部分4层&#xff08;传输层&#xff09;的功能。 关于4层限速 Nginx自身的限制&#x…...

Spring Cloud Alibaba 之 “Feign多参数构造”

在上一篇文章整合好了Feign&#xff0c;现在来总结以下Feign调用多参数方法的使用。 GET方式&#xff1a; Spring Cloud为Feign支持了Spring Mvc注解的。如果请求的是localhost:8083/test?id1&namecoco,那么如果我们这样写&#xff08;User实体类有这二个属性&#xff09…...

C#高级教程

目录 C# 特性&#xff08;Attribute&#xff09;C# 反射&#xff08;Reflection&#xff09;C# 属性&#xff08;Property&#xff09;C# 索引器&#xff08;Indexer&#xff09;C# 委托&#xff08;Delegate&#xff09;C# 事件&#xff08;Event&#xff09;C# 集合&#xf…...

c++ 位图和布隆过滤器

位图&#xff08;bitmap&#xff09; 定义 位图是一种使用位数组存储数据的结构。每一位表示一个状态&#xff0c;通常用于快速判断某个值是否存在&#xff0c;或者用来表示布尔类型的集合。 特点 节省空间&#xff1a;一个字节可以表示8个状态。高效操作&#xff1a;位操作…...

基于Springboot开发的云野旅游平台

一、功能介绍 云野旅游平台包含管理员、用户两个角色以及前后台系统。 前台系统功能 用户登录成功后&#xff0c;可以进行查看旅游路线、最新线路、旅游资讯、个人中心、后台管理、购物车、客服等功能模块。进行相对应操作。 后台系统功能 管理员或用户登录成功后&#xf…...

微服务即时通讯系统(5)用户管理子服务,网关子服务

用户管理子服务&#xff08;user文件&#xff09; 用户管理子服务也是这个项目中的一个业务最多的子服务&#xff0c;接口多&#xff0c;但是主要涉及的数据表只有user表&#xff0c;Redis的键值对和ES的一个搜索引擎&#xff0c;主要功能是对用户的个人信息进行修改管理&#…...

docker.io连接超时的处理,用代理网站

docker pull的时候会超时&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 这时可以找一些代理网站&#xff0c;比如…...

【测试工具JMeter篇】JMeter性能测试入门级教程(四):JMeter中BeanShell内置方法使用

一、什么是BeanShell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似);BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简…...

JavaScript 键盘控制移动

如果你想通过 JavaScript 实现键盘控制对象&#xff08;比如一个方块&#xff09;的移动&#xff0c;下面是一个简单的示例&#xff0c;展示如何监听键盘事件并根据按下的键来移动一个元素。 HTML 和 CSS&#xff1a; <!DOCTYPE html> <html lang"en">…...

如何预防服务器后台爆破攻击

服务器后台爆破&#xff08;Brute Force Attack&#xff09;是一种通过反复尝试用户名和密码组合&#xff0c;以非法获取系统访问权限的攻击方式。这种攻击不仅会消耗服务器资源&#xff0c;还可能导致合法用户被锁定或敏感数据泄露。为了有效预防服务器后台爆破攻击&#xff0…...

AI 写作(一):开启创作新纪元(1/10)

一、AI 写作&#xff1a;重塑创作格局 在当今数字化高速发展的时代&#xff0c;AI 写作正以惊人的速度重塑着创作格局。AI 写作在现代社会中占据着举足轻重的地位&#xff0c;发挥着不可替代的作用。 随着信息的爆炸式增长&#xff0c;人们对于内容的需求日益旺盛。AI 写作能够…...

【HarmonyOS】鸿蒙应用使用lottie动画

【HarmonyOS】鸿蒙应用使用lottie动画 一、lottie动画是什么&#xff1f; https://airbnb.design/lottie Lottie是由Airbnb团队开发的一个适用于iOS、Android、React Native、Web和Windows的开源动画库&#xff0c;用于解析使用Bodymovin导出为JSON的Adobe After Effects动…...

SQL面试题——腾讯SQL面试题 合并连续支付订单

合并连续支付订单 现有一张用户支付表:user_pay包含字段订单ID,用户ID,商户ID,支付时间,支付金额。如果同一用户在同一商户存在多笔订单,且中间该用户没有其他商户的支付记录,则认为是连续订单,请把连续订单进行合并,时间取最早支付时间,金额求和。 +----------+------…...

【docker】10. 容器操作案例

容器操作案例 容器基本操作 • 通过 nginx 镜像文件创建容器 • 容器的列举(包含正在运行的容器) # 发现此时 e7c33d9f5c61 这个容器运行的状态为 Up,即运行状态 rootLAPTOP-H2EI4I6A:~# docker container ls CONTAINER ID IMAGE COMMAND CREATED …...

postman测试

当然&#xff0c;以下是针对你提供的API层和Service层代码中涉及到的各个接口&#xff0c;如何使用 Postman 进行详细测试的指南。这个指南将帮助你理解如何配置 Postman 来测试这些接口&#xff0c;包括请求的构造、认证的处理、以及如何解读响应。 目录 准备工作接口测试指…...

【攻防实验】溯源与取证分析实验

溯源与取证分析实验 溯源取证分析作为网络攻防过程中重要环节&#xff0c;准确找到攻击者的入侵线索(尤其是攻击突破口、攻击IP地址、域名、工具等信息)&#xff0c;对于企业或者团队安全运营团队来说都是必备技能。常规攻击取证过程中往往会结合流量、Web访问日志、终端系统或…...

【测试工具JMeter篇】JMeter性能测试入门级教程(七):JMeter断言

一、前言 在 JMeter 中&#xff0c;断言元件&#xff08;Assertion&#xff09;用于验证测试结果是否符合预期。断言元件可以检查服务器的响应数据&#xff0c;以确保它们符合期望的模式或值&#xff0c;从而验证性能测试脚本的正确性。断言元件通常在每个请求的响应中添加&am…...

Linux 常用命令

目录 一、ls 指令 二、pwd命令 三、cd 指令 1、cd 目录名 2、cd .. 返回上级目录 3、cd ~ 进入用户家目 4、cd - 返回最近访问目录 5、cd相对路径&&cd绝对路径 四、touch指令 五、mkdir指令 1、mkdir 目录名 创建一个目录 2、mkdir -p 递归创建多…...

汽车IVI中控OS Linux driver开发实操(二十八):回声消除echo cancellation和噪声消除Noise reduction

概述: 在当今高度互联的世界中,清晰的实时通信比以往任何时候都更重要。在远程团队会议期间,没有什么能像回声一样打断对话。当说话者听到他们的声音回响时,可能会分散注意力,甚至无法理解对话。即使是很小的回声也会产生很大的影响,仅仅25毫秒的振幅就足以造成声音干扰…...

003-SpringBoot整合Pagehelper

SpringBoot整合Pagehelper 一、引入依赖二、配置 application.yml三、配置 MybatisPlusConfig四、Controller五、ServiceImpl 一、引入依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</ar…...

零基础学安全--shell练习

目录 用shell写一个计算器 测试​ 一些小问题 n阶乘数 测试 拓展 写⼀个Shell脚本去筛选出eth0⽹卡的ipv4地址&#xff0c;并赋值⼀个变量输出 测试 无限重启 用shell写一个计算器 read -p "请输入数字a: " number1 read -p "请输入操作符&#xf…...

【专题】计算机网络之运输层(传输层)

1. 运输层协议概述 1.1 进程之间的通信 (1) 运输层的作用 运输层提供进程间的逻辑通信。 运输层的屏蔽作用&#xff1a; 运输层向高层用户屏蔽了下面网络核心的细节&#xff08;如网络拓扑、所采用的路由选择协议等&#xff09;&#xff0c;使应用进程看见的就是好像在两个运…...

【leetcode100】旋转图像

1、题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],…...

软件工程——期末复习(1)

名词解释&#xff1a; 名词解释--人月 答案&#xff1a;人月是软件开发工作量的单位&#xff0c;1人月表示1个程序员1个月的工作时间所开发的代码量。 请解释软件缺陷、错误和失败&#xff0c;并简单举例说明。 答案&#xff1a;缺陷&#xff08;defect&#xff09;指系统代…...

HTML5系列(3)--多媒体标签详解

前端技术探索系列&#xff1a;HTML5 多媒体标签详解 &#x1f3a5; 开篇寄语 &#x1f44b; 前端开发者们&#xff0c; 在前三篇文章中&#xff0c;我们探讨了 HTML5 的语义化和表单特性。今天&#xff0c;让我们深入了解 HTML5 的多媒体能力&#xff0c;看看如何构建强大的…...

Spring Boot 3.4.0 发布:功能概览与示例

Spring Boot 3.4.0 带来了许多增强功能&#xff0c;使现代应用开发更加高效、便捷和强大。以下是最新功能的完整概述&#xff0c;以及一些帮助您快速入门的代码示例。 1. 应用程序版本管理 Spring Boot 引入了 spring.application.version 属性&#xff0c;方便开发者设置和访…...

【Vue3】【Naive UI】<n-upload>标签

【Vue3】【Naive UI】标签 基本设置 【VUE3】【Naive UI】&#xff1c;NCard&#xff1e; 标签 【VUE3】【Naive UI】&#xff1c;n-button&#xff1e; 标签 【VUE3】【Naive UI】&#xff1c;a&#xff1e; 标签 【VUE3】【Naive UI】&#xff1c;NDropdown&#xff1e; 标签…...

7.代理模式(Proxy Pattern)

古朗月行 代理模式JDK动态代理代码示例原码分析 cglib动态代理代码示例源码分析 JDK cglib动态代理对比ClassLoader类的生命周期&#xff1a; 参考资料 唐 李白 小时不识月&#xff0c;呼作白玉盘。 又疑瑶台镜&#xff0c;飞在青云端。 仙人垂两足&#xff0c;桂树何团团。…...

【效果】回到顶部功能实现

实现效果&#xff1a; 相关代码&#xff1a; <template><div class"cats" :style"{ top: catsTop }" ref"cats" click"catTop"></div> </template> 样式&#xff1a; /* 回到顶部 - 小猫咪 */ .cats {posi…...