详解Rust标准库:VecDeque 队列
theme: github
highlight: an-old-hope
查看本地官方文档
安装rust
后运行
rustup doc
查看The Standard Library
即可获取标准库内容
std::connections::VecDeque定义
队列是遵循先入先出规则的线性数据结构,在内存中不一定连续
VecDeque
定义:可增长的环形缓冲区实现的双端队列
pub struct VecDeque<T, A: Allocator = Global> {// 队列头部在内部缓冲区中的索引位置head: usize,// 当前队列中的元素数量len: usize,// 管理内存分配和释放,确保有足够的空间来存储队列中的元素buf: RawVec<T, A>,
}
方法
with_capacity
:用于创建一个具有指定初始容量的VecDeque
use std::collections::VecDeque;fn main() {let deque = VecDeque::from([1, 2, 3]);if let Some(element) = deque.get(1) {println!("Element at index 1: {}", element);// Element at index 1: 2}
}
get
:获取指定索引位置的元素的不可变引用
use std::collections::VecDeque;fn main() {let deque = VecDeque::from([1, 2, 3]);if let Some(element) = deque.get(1) {println!("Element at index 1: {}", element);// Element at index 1: 2}
}
get_mut
:获取指定索引位置的元素的可变引用
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3]);if let Some(element) = deque.get_mut(1) {*element = 4;}println!("Modified deque: {:?}", deque);// Modified deque: [1, 4, 3]
}
swap
:交换VecDeque中两个指定索引位置的元素
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3]);deque.swap(0, 2);println!("Swapped deque: {:?}", deque);// Swapped deque: [3, 2, 1]
}
capacity
:返回VecDeque当前的容量
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::with_capacity(5);println!("Initial capacity: {}", deque.capacity());// Initial capacity: 5deque.push_back(1);println!("Capacity after adding an element: {}", deque.capacity());// Capacity after adding an element: 5
}
reserve_exact
:精确地预留足够的空间以容纳指定数量的额外元素
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::new();deque.reserve_exact(3);println!("Capacity after reserve_exact: {}", deque.capacity());// Capacity after reserve_exact: 3deque.push_back(1);deque.push_back(2);deque.push_back(3);
}
reserve
:预留足够的空间以容纳指定数量的额外元素(空间不够自动增长)
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::new();deque.reserve(5);println!("Capacity after reserve: {}", deque.capacity());// Capacity after reserve: 5deque.push_back(1);deque.push_back(2);deque.push_back(3);deque.push_back(4);deque.push_back(5);deque.push_back(6);println!("Capacity after reserve: {}", deque.capacity());// Capacity after reserve: 10
}
try_reserve_exact
:尝试精确地预留足够的空间以容纳指定数量的额外元素,如果预留成功则返回Ok(())
,否则返回错误
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::new();if let Ok(()) = deque.try_reserve_exact(3) {println!("Reserved successfully. Capacity: {}", deque.capacity());// Reserved successfully. Capacity: 3} else {println!("Reserve failed.");}deque.push_back(1);deque.push_back(2);deque.push_back(3);deque.push_back(4);println!("Reserved successfully. Capacity: {}", deque.capacity());// Reserved successfully. Capacity: 6
}
try_reserve
:尝试预留足够的空间以容纳指定数量的额外元素,如果预留成功则返回Ok(())
,否则返回错误
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::new();if let Ok(()) = deque.try_reserve(3) {println!("Reserved successfully. Capacity: {}", deque.capacity());// Reserved successfully. Capacity: 4} else {println!("Reserve failed.");}deque.push_back(1);deque.push_back(2);deque.push_back(3);deque.push_back(4);
}
shrink_to_fit
:将VecDeque
的容量收缩到与当前元素数量相同
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::with_capacity(10);deque.push_back(1);deque.push_back(2);deque.push_back(3);deque.shrink_to_fit();println!("Capacity after shrink_to_fit: {}", deque.capacity());// Capacity after shrink_to_fit: 3
}
shrink_to
:将VecDeque
的容量收缩到指定大小
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::with_capacity(10);deque.push_back(1);deque.push_back(2);deque.push_back(3);deque.shrink_to(5);println!("Capacity after shrink_to: {}", deque.capacity());// Capacity after shrink_to: 5
}
truncate
:将VecDeque
截断到指定长度
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3, 4, 5]);deque.truncate(3);println!("Truncated deque: {:?}", deque);// Truncated deque: [1, 2, 3]
}
iter
:返回一个不可变的迭代器,用于遍历VecDeque
中的元素
use std::collections::VecDeque;fn main() {let deque = VecDeque::from([1, 2, 3]);for element in deque.iter() {println!("Element: {}", element);}// Element: 1// Element: 2// Element: 3
}
iter_mut
:返回一个可变的迭代器,允许在遍历过程中修改VecDeque
中的元素
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3]);for element in deque.iter_mut() {*element *= 2;}println!("Modified deque: {:?}", deque);// Modified deque: [2, 4, 6]
}
as_slice
:将VecDeque
分成不可变的切片
use std::collections::VecDeque;fn main() {let deque = VecDeque::from([1, 2, 3, 4, 5]);let (front_slice, back_slice) = deque.as_slices();println!("Front slice: {:?}", front_slice);// Front slice: [1, 2, 3, 4, 5]println!("Back slice: {:?}", back_slice);// Back slice: []
}
as_mut_slices
:将VecDeque
分成可变的切片
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3, 4, 5]);let (front_slice, back_slice) = deque.as_mut_slices();for element in front_slice {*element *= 2;}for element in back_slice {*element *= 3;}println!("Modified deque: {:?}", deque);// Modified deque: [2, 4, 6, 8, 10]
}
len
:返回VecDeque
中元素的数量
use std::collections::VecDeque;fn main() {let deque = VecDeque::from([1, 2, 3]);println!("Length of deque: {}", deque.len());// Length of deque: 3
}
is_empty
:判断VecDeque
是否为空
use std::collections::VecDeque;fn main() {let deque:VecDeque<i32> = VecDeque::new();println!("Is deque empty? {}", deque.is_empty());// Is deque empty? truelet deque2 = VecDeque::from([1]);println!("Is deque2 empty? {}", deque2.is_empty());// Is deque2 empty? false
}
range
:返回一个指定范围内的不可变迭代器
use std::collections::VecDeque;fn main() {let deque = VecDeque::from([1, 2, 3, 4, 5]);for element in deque.range(1..3) {println!("Element: {}", element);// Element: 2// Element: 3}
}
range_mut
:返回一个指定范围内的可变迭代器
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3, 4, 5]);for element in deque.range_mut(1..3) {*element *= 2;}println!("Modified deque: {:?}", deque);// Modified deque: [1, 4, 6, 4, 5]
}
drain
:移除并返回一个迭代器,用于遍历被移除的元素
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3, 4, 5]);let drained = deque.drain(1..3).collect::<Vec<i32>>();println!("Drained elements: {:?}", drained);// Drained elements: [2, 3]println!("Remaining deque: {:?}", deque);// Remaining deque: [1, 4, 5]
}
clear
:清空VecDeque
,移除所有元素
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3]);println!("Before clearing: {:?}", deque);// Before clearing: [1, 2, 3]deque.clear();println!("After clearing: {:?}", deque);// After clearing: []
}
contains
:判断VecDeque
中是否包含特定元素
use std::collections::VecDeque;fn main() {let deque = VecDeque::from([1, 2, 3]);println!("Does deque contain 2? {}", deque.contains(&2));// Does deque contain 2? trueprintln!("Does deque contain 4? {}", deque.contains(&4));// Does deque contain 4? false
}
front
:返回VecDeque
头部元素的不可变引用,如果为空则返回None
use std::collections::VecDeque;fn main() {let deque = VecDeque::from([1, 2, 3]);if let Some(element) = deque.front() {println!("Front element: {}", element);// Front element: 1}
}
front_mut
:返回VecDeque
头部元素的可变引用,如果为空则返回None
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3]);if let Some(element) = deque.front_mut() {*element = 4;}println!("Modified deque: {:?}", deque);// Modified deque: [4, 2, 3]
}
back
:返回VecDeque
尾部元素的不可变引用,如果为空则返回None
use std::collections::VecDeque;fn main() {let deque = VecDeque::from([1, 2, 3]);if let Some(element) = deque.back() {println!("Back element: {}", element);// Back element: 3}
}
back_mut
:返回VecDeque
尾部元素的可变引用,如果为空则返回None
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3]);if let Some(element) = deque.back_mut() {*element = 4;}println!("Modified deque: {:?}", deque);// Modified deque: [1, 2, 4]
}
pop_front
:移除并返回VecDeque
头部元素,如果为空则返回None
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3]);if let Some(element) = deque.pop_front() {println!("Popped element: {}", element);// Popped element: 1}println!("Remaining deque: {:?}", deque);// Remaining deque: [2, 3]
}
pop_back
:移除并返回VecDeque
尾部元素,如果为空则返回None
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3]);if let Some(element) = deque.pop_back() {println!("Popped element: {}", element);// Popped element: 3}println!("Remaining deque: {:?}", deque);// Remaining deque: [1, 2]
}
push_front
:在VecDeque
头部插入一个元素
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::new();deque.push_front(1);deque.push_front(2);println!("Modified deque: {:?}", deque);// Modified deque: [2, 1]
}
push_back
:在VecDeque
尾部插入一个元素
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::new();deque.push_back(1);deque.push_back(2);println!("Modified deque: {:?}", deque);// Modified deque: [1, 2]
}
swap_remove_front
:移除并返回VecDeque
头部开始的元素索引,同时用其后的第一个元素替换它,避免移动其后的所有元素,如果为空则返回None
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3, 4]);if let Some(element) = deque.swap_remove_front(2) {println!("Swapped and removed element: {}", element);// Swapped and removed element: 3}println!("Remaining deque: {:?}", deque);// Remaining deque: [2, 1, 4]
}
swap_remove_back
:移除并返回VecDeque
尾部开始的元素索引,同时用前一个元素替换它,避免移动前面的所有元素,如果为空则返回None
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3, 4]);if let Some(element) = deque.swap_remove_back(2) {println!("Swapped and removed element from back: {}", element);// Swapped and removed element from back: 3}println!("Remaining deque: {:?}", deque);// Remaining deque: [1, 2, 4]
}
insert
:在指定索引位置插入一个元素。如果索引超出范围,会导致程序 panic
(元素为[1,2,3]
时容量为3,插入索引1不改变容量,插入4时由于索引是连续的,会开辟原队列的两倍容量6,后续插入索引5可以成功,如果直接插入5索引不连续不会开辟新空间会panic
)
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3]);println!("deque capacity: {}", deque.capacity());// deque capacity: 3deque.insert(1, 9);// deque.insert(4, 5); // 这一行存在以下操作成功,不存在 panic!deque.insert(5, 6); // panic!'println!("deque capacity: {}", deque.capacity());// deque capacity: 6println!("After insertion: {:?}", deque);// After insertion: [1, 9, 2, 4, 3, 6]println!("deque capacity: {}", deque.capacity());// deque capacity: 6
}
remove
:移除指定索引位置的元素,并返回该元素。如果索引超出范围,会导致程序 panic
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3]);if let Some(element) = deque.remove(1) {println!("Removed element: {}", element);// Removed element: 2}println!("Remaining deque: {:?}", deque);// Remaining deque: [1, 3]
}
split_off
:在指定索引位置将VecDeque
分割成两个,返回从指定索引开始的后半部分
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3, 4, 5]);let deque2 = deque.split_off(2);println!("{:?}", deque2);// [3, 4, 5]
}
append
:将另一个VecDeque
的所有元素追加到当前VecDeque
的末尾
use std::collections::VecDeque;fn main() {let mut deque1 = VecDeque::from([1, 2, 3]);let mut deque2 = VecDeque::from([4, 5, 6]);deque1.append(&mut deque2);println!("Appended deque: {:?}", deque1);// Appended deque: [1, 2, 3, 4, 5, 6]
}
retain
:保留满足给定谓词的元素,移除不满足的元素
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3, 4, 5]);deque.retain(|&x| x % 2 == 0);println!("After retain: {:?}", deque);// After retain: [2, 4]
}
retain_mut
:与retain
类似,但可以对元素进行可变操作
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3, 4, 5]);deque.retain_mut(|x| {*x *= 2;*x % 3 == 0});println!("After retain_mut: {:?}", deque);// After retain_mut: [6]
}
resize_with
:调整VecDeque
的大小到指定长度,使用给定的函数生成新元素填充额外的空间或者截断多余的元素
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2]);deque.resize_with(5, || 0);println!("Resized deque: {:?}", deque);// Resized deque: [1, 2, 0, 0, 0]
}
make_contiguous
:尝试使VecDeque
在内存中连续存储,可能会导致重新分配内存
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3]);deque.make_contiguous();println!("After make_contiguous: {:?}", deque);// After make_contiguous: [1, 2, 3]
}
rotate_left
:将VecDeque
向左旋转指定的步数
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3, 4, 5]);deque.rotate_left(2);println!("After rotate_left: {:?}", deque);// After rotate_left: [3, 4, 5, 1, 2]
}
rotate_right
:将VecDeque
向右旋转指定的步数
use std::collections::VecDeque;fn main() {let mut deque = VecDeque::from([1, 2, 3, 4, 5]);deque.rotate_right(2);println!("After rotate_right: {:?}", deque);// After rotate_right: [4, 5, 1, 2, 3]
}
binary_search
:在已排序的VecDeque
中进行二分查找指定元素,返回一个Result
类型,表示查找结果。如果找到元素,返回Ok(index)
,默认最后一个结果;如果未找到返回Err()
;在未排序的队列进行查找会返回unspecified
,这个结果没有意义
当查找的元素不存在时返回查找元素应当插入位置有序队列位置的索引
当查找的元素存在时返回最后一个匹配的元素
use std::collections::VecDeque;fn main() {let deque = VecDeque::from([1, 2, 3, 3, 4, 5]);let result = deque.binary_search(&3);println!("{:?}", result);// Ok(3)// 有序且不存在let deque = VecDeque::from([3, 3, 3, 3, 3, 4, 4, 7, 8]);let result = deque.binary_search(&5);println!("{:?}", result);// Err(7)// 有序且存在let deque = VecDeque::from([3, 3, 3, 3, 3, 4, 4, 7, 8]);let result = deque.binary_search(&3);println!("{:?}", result);// Ok(4)// 注意以下结果没有意义// 无序且不存在let deque = VecDeque::from([3, 9, 3, 3, 8, 4, 3, 7, 3]);let result = deque.binary_search(&5);println!("{:?}", result);// Err(4)// 无序且存在let deque = VecDeque::from([3, 9, 3, 3, 8, 4, 3, 7, 3]);let result = deque.binary_search(&3);println!("{:?}", result);// Ok(2)
}
binary_search_by
:使用自定义的比较函数在已排序的VecDeque
中进行二分查找
use std::collections::VecDeque;fn main() {let deque = VecDeque::from([1, 2, 3, 3, 4, 6]);// 找到最后一个等于3的元素索引let result = deque.binary_search_by(|x| x.cmp(&3));println!("{:?}", result);// Ok(3)// 找到最后一个等于5de的元素索引,不存在返回应当插入位置的索引let result = deque.binary_search_by(|x| x.cmp(&5));println!("{:?}", result);// Err(5)
}
binary_search_by_key
:如果队列是以元组键的顺序排序的,使用自定义的键提取函数在已排序的VecDeque
中进行二分查找
use std::collections::VecDeque;fn main() {let deque = VecDeque::from([(0, 0),(2, 1),(4, 1),(5, 1),(3, 1),(1, 2),(2, 3),(4, 5),(5, 8),(3, 13),(1, 21),(2, 34),(4, 55),]);// 按元组第二个键值排序let result = deque.binary_search_by_key(&13, |&(a, b)| b);println!("{:?}", result);// Ok(9)
}
partition_point
:在已排序的VecDeque
中找到满足给定谓词的元素的分界点。即返回第一个不满足谓词的元素的索引
use std::collections::VecDeque;fn main() {let deque: VecDeque<i32> = VecDeque::from([1, 2, 3, 3, 5, 6, 7]);// 按小于5的元素划分,返回第一个大于等于5的索引let result = deque.partition_point(|&x| x < 5);println!("{:?}", result);// 4
}
相关文章:
详解Rust标准库:VecDeque 队列
theme: github highlight: an-old-hope 查看本地官方文档 安装rust后运行 rustup doc查看The Standard Library即可获取标准库内容 std::connections::VecDeque定义 队列是遵循先入先出规则的线性数据结构,在内存中不一定连续 VecDeque定义:可增长…...
网络协议都有哪些?
网络协议是为计算机网络中进行数据交换而建立的规则、标准或约定的集合。以下是一些常见的网络协议: TCP/IP协议:传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础。由网络层的…...
非公平锁和公平锁的区别
公平锁(Fair Lock): 公平锁遵循 FIFO(先进先出)原则。当多个线程在等待锁时,公平锁会确保等待时间最长的线程优先获得锁。 这种锁机制可以避免线程饥饿(starvation),即某…...

11月7日星期四今日早报简报微语报早读
11月7日星期四,农历十月初七,早报#微语早读。 1、河南:旅行社组织1000人次境外游客在豫住宿2夜以上,可申请激励奖补; 2、主播宣称下播后商品恢复原价构成欺诈,广州市监:罚款5万元;…...

【Python】轻松实现机器翻译:Transformers库使用教程
轻松实现机器翻译:Transformers库使用教程 近年来,机器翻译技术飞速发展,从传统的基于规则的翻译到统计机器翻译,再到如今流行的神经网络翻译模型,尤其是基于Transformer架构的模型,翻译效果已经有了质的飞…...

【数据集】【YOLO】【目标检测】道路结冰数据集 1527 张,YOLO目标检测实战训练教程!
数据集介绍 【数据集】道路结冰数据集 1527 张,目标检测,包含YOLO/VOC格式标注。数据集中包含2种分类:“clear_road, ice_road”。数据集来自国内外图片网站和视频截图,部分数据经过数据增强处理。检测范围监控视角检测、无人机视…...

Java链表及源码解析
文章目录 创建一个ILindkedList接口创建方法(模拟实现链表方法)创建MyLinkedList来实现接口的方法创建链表节点addFirst方法(新增头部属性)addLast方法(新增到末尾一个属性)remove方法(删除指定属性)addInd…...
十、快速入门go语言之方法
文章目录 方法:one: 方法的概念:star2: 内嵌类型的方法和继承:star2: 多重继承 📅 2024年5月9日 📦 使用版本为1.21.5 方法 1️⃣ 方法的概念 ⭐️ 在Go语言中没有类这个概念,可以使用结构体来实现,那类方法呢?Go也…...
JVM 处理多线程并发执行
JVM(Java Virtual Machine)在处理多线程并发执行方面具有强大的支持,主要依赖于其内置的线程模型、内存模型以及同步机制。 JVM 通过以下关键机制和组件来管理多线程并发执行: 1. 线程模型 Java 线程与操作系统线程:…...

【D3.js in Action 3 精译_039】4.3 D3 面积图的绘制方法及其边界标签的添加
当前内容所在位置: 第四章 直线、曲线与弧线的绘制 ✔️ 4.1 坐标轴的创建(上篇) 4.1.1 D3 中的边距约定(中篇)4.1.2 坐标轴的生成(中篇) 4.1.2.1 比例尺的声明(中篇)4.1…...

布谷直播源码部署服务器关于数据库配置的详细说明
布谷直播源码搭建部署配置接口数据库 /public/db.php(2019年8月后的系统在该路径下配置数据库,老版本继续走下面的操作) 在项目代码中执行命令安装依赖库(⚠️注意:如果已经有了vendor内的依赖文件的就不用执行了&am…...

Xfce桌面设置右键菜单:用右键打开VSCode
前言 AlmaLinux安装VSCode之后始终没有找到如何用右键菜单打开VSCode,比Windows麻烦多了。每次都需要先找到文件夹,然后用系统自带的Open In Terminal打开终端,再输入code .,才能够在当前文件夹中快速打开VSCode。那么࿰…...

【NLP自然语言处理】深入探索Self-Attention:自注意力机制详解
目录 🍔 Self-attention的特点 🍔 Self-attention中的归一化概述 🍔 softmax的梯度变化 3.1 softmax函数的输入分布是如何影响输出的 3.2 softmax函数在反向传播的过程中是如何梯度求导的 3.3 softmax函数出现梯度消失现象的原因 &…...
Pytorch训练时报nan
0. 引言 Pytorch训练时在batchN时loss为nan。经过断点检查发现在batchN-1时,网络参数非nan,输出非nan,但梯度为nan,导致网络参数已经全部被更新为nan,遇到这种情况应该如何排查,如何避免?由于导…...
JavaScript定时器详解:setTimeout与setInterval的使用与注意事项
在JavaScript中,定时器用于在指定的时间间隔后或周期性地执行代码。JavaScript 提供了两种主要的定时器函数:setTimeout 和 setInterval。以下是它们的详细解释和实现方式: 1. setTimeout setTimeout 函数用于在指定的毫秒数后执行一次函数…...

CSS——选择器、PxCook软件、盒子模型
选择器 结构伪类选择器 作用:根据元素的结构关系查找元素。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…...

Mysql 大表limit查询优化原理实战
文章目录 1 大表查询无条件优化&原理(入门)2 大表查询带 条件 优化&原理(进阶)2.1 where 后面的查询字段只有一个时,要求该字段是索引字段2.2 where 后面的查询字段有多个时,尽量让查询字段为索引字段且字段值基数大 3 大表查询带 排序 优化&…...

在vscode中开发运行uni-app项目
确保电脑已经安装配置好了node、vue等相关环境依赖 进行项目的创建 vue create -p dcloudio/uni-preset-vue 项目名 vue create -p dcloudio/uni-preset-vue uni-app 选择模版 这里选择【默认模版】 项目创建成功后在vscode中打开 第一次打开项目 pages.json 文件会报错&a…...

【JavaEE初阶 — 多线程】Thread的常见构造方法&属性
目录 Thread类的属性 1.Thread 的常见构造方法 2.Thread 的几个常见属性 2.1 前台线程与后台线程 2.2 setDaemon() 2.3 isAlive() Thread类的属性 Thread 类是JVM 用来管理线程的一个类,换句话说,每个线程都有一个唯一的Thread 对象与之关联&am…...

ctfshow(316)--XSS漏洞--反射性XSS
Web316 进入界面: 审计 显示是关于反射性XSS的题目。 思路 首先想到利用XSS平台解题,看其他师傅的wp提示flag是在cookie中。 当前页面的cookie是flagyou%20are%20not%20admin%20no%20flag。 但是这里我使用XSS平台,显示的cookie还是这样…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...