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

详解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定义 队列是遵循先入先出规则的线性数据结构&#xff0c;在内存中不一定连续 VecDeque定义&#xff1a;可增长…...

网络协议都有哪些?

网络协议是为计算机网络中进行数据交换而建立的规则、标准或约定的集合。以下是一些常见的网络协议&#xff1a; TCP/IP协议&#xff1a;传输控制协议/因特网互联协议&#xff0c;又名网络通讯协议&#xff0c;是Internet最基本的协议、Internet国际互联网络的基础。由网络层的…...

非公平锁和公平锁的区别

公平锁&#xff08;Fair Lock&#xff09;&#xff1a; 公平锁遵循 FIFO&#xff08;先进先出&#xff09;原则。当多个线程在等待锁时&#xff0c;公平锁会确保等待时间最长的线程优先获得锁。 这种锁机制可以避免线程饥饿&#xff08;starvation&#xff09;&#xff0c;即某…...

11月7日星期四今日早报简报微语报早读

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

【Python】轻松实现机器翻译:Transformers库使用教程

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

【数据集】【YOLO】【目标检测】道路结冰数据集 1527 张,YOLO目标检测实战训练教程!

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

Java链表及源码解析

文章目录 创建一个ILindkedList接口创建方法(模拟实现链表方法)创建MyLinkedList来实现接口的方法创建链表节点addFirst方法&#xff08;新增头部属性&#xff09;addLast方法&#xff08;新增到末尾一个属性&#xff09;remove方法&#xff08;删除指定属性&#xff09;addInd…...

十、快速入门go语言之方法

文章目录 方法:one: 方法的概念:star2: 内嵌类型的方法和继承:star2: 多重继承 &#x1f4c5; 2024年5月9日 &#x1f4e6; 使用版本为1.21.5 方法 1️⃣ 方法的概念 ⭐️ 在Go语言中没有类这个概念&#xff0c;可以使用结构体来实现&#xff0c;那类方法呢&#xff1f;Go也…...

JVM 处理多线程并发执行

JVM&#xff08;Java Virtual Machine&#xff09;在处理多线程并发执行方面具有强大的支持&#xff0c;主要依赖于其内置的线程模型、内存模型以及同步机制。 JVM 通过以下关键机制和组件来管理多线程并发执行&#xff1a; 1. 线程模型 Java 线程与操作系统线程&#xff1a;…...

【D3.js in Action 3 精译_039】4.3 D3 面积图的绘制方法及其边界标签的添加

当前内容所在位置&#xff1a; 第四章 直线、曲线与弧线的绘制 ✔️ 4.1 坐标轴的创建&#xff08;上篇&#xff09; 4.1.1 D3 中的边距约定&#xff08;中篇&#xff09;4.1.2 坐标轴的生成&#xff08;中篇&#xff09; 4.1.2.1 比例尺的声明&#xff08;中篇&#xff09;4.1…...

布谷直播源码部署服务器关于数据库配置的详细说明

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

Xfce桌面设置右键菜单:用右键打开VSCode

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

【NLP自然语言处理】深入探索Self-Attention:自注意力机制详解

目录 &#x1f354; Self-attention的特点 &#x1f354; Self-attention中的归一化概述 &#x1f354; softmax的梯度变化 3.1 softmax函数的输入分布是如何影响输出的 3.2 softmax函数在反向传播的过程中是如何梯度求导的 3.3 softmax函数出现梯度消失现象的原因 &…...

Pytorch训练时报nan

0. 引言 Pytorch训练时在batchN时loss为nan。经过断点检查发现在batchN-1时&#xff0c;网络参数非nan&#xff0c;输出非nan&#xff0c;但梯度为nan&#xff0c;导致网络参数已经全部被更新为nan&#xff0c;遇到这种情况应该如何排查&#xff0c;如何避免&#xff1f;由于导…...

JavaScript定时器详解:setTimeout与setInterval的使用与注意事项

在JavaScript中&#xff0c;定时器用于在指定的时间间隔后或周期性地执行代码。JavaScript 提供了两种主要的定时器函数&#xff1a;setTimeout 和 setInterval。以下是它们的详细解释和实现方式&#xff1a; 1. setTimeout setTimeout 函数用于在指定的毫秒数后执行一次函数…...

CSS——选择器、PxCook软件、盒子模型

选择器 结构伪类选择器 作用&#xff1a;根据元素的结构关系查找元素。 <!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 后面的查询字段只有一个时&#xff0c;要求该字段是索引字段2.2 where 后面的查询字段有多个时&#xff0c;尽量让查询字段为索引字段且字段值基数大 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 用来管理线程的一个类&#xff0c;换句话说&#xff0c;每个线程都有一个唯一的Thread 对象与之关联&am…...

ctfshow(316)--XSS漏洞--反射性XSS

Web316 进入界面&#xff1a; 审计 显示是关于反射性XSS的题目。 思路 首先想到利用XSS平台解题&#xff0c;看其他师傅的wp提示flag是在cookie中。 当前页面的cookie是flagyou%20are%20not%20admin%20no%20flag。 但是这里我使用XSS平台&#xff0c;显示的cookie还是这样…...

ubuntu22.04安装conda

在 Ubuntu 22.04 上安装 Conda 可以通过以下步骤进行&#xff1a; 下载 Miniconda&#xff08;轻量级版本的 Conda&#xff09;&#xff1a; 打开终端并运行以下命令以下载 Miniconda 安装脚本&#xff1a; wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-…...

D58【python 接口自动化学习】- python基础之异常

day58 异常捕获 学习日期&#xff1a;20241104 学习目标&#xff1a;异常 -- 74 自定义异常捕获&#xff1a;如何定义业务异常&#xff1f; 学习笔记&#xff1a; 自定义异常的用途 自定义异常的方法 # 抛出一个异常 # raise ValueError(value is error) # ValueError: val…...

Java项目实战II基于Spring Boot的便利店信息管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在快节奏的…...

Java-日期计算工具类DateCalculator

DateCalculator是用于日期计算的工具类。这个工具类将包括日期的加减、比较、周期计算、日期 范围生成等功能。 import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Period; import java.time.temporal.ChronoUnit;…...

单片机串口接收状态机STM32

单片机串口接收状态机stm32 前言 项目的芯片stm32转国产&#xff0c;国产芯片的串口DMA接收功能测试不通过&#xff0c;所以要由原本很容易配置的串口空闲中断触发DMA接收数据的方式转为串口逐字节接收的状态机接收数据 两种方式各有优劣&#xff0c;不过我的芯片已经主频跑…...

ipv6的 fc00(FC00::/7) 和 fec0(FEC0::/10)

ipv6的 fc00(FC00::/7)&#xff08;唯一本地地址&#xff09; 替代了 fec0(FEC0::/10) &#xff08;站点本地地址&#xff0c;已弃用&#xff09; ipv6的 fc00(FC00::/7) 替代了 fec0(FEC0::/10) , 在IPv6地址中&#xff0c;FC00::/7&#xff08;通常简写为FC00&#xff09;和…...

Chat GPT英文学术写作指令

目录 Chat GPT英文学术写作指令 Chat GPT英文学术写作指令 1."为我捉供一些建议和技巧,以提高我的学术写作质最和风格" (Provide me with some suggestions andtips to improve the quality andstyleofmyacademic writing.) 2."帮我提写一个清晰而有逻辑的…...

超详细Pycharm安装汉化教程,Python环境配置和使用指南,Python零基础入门看这个就够了!

包含编程资料、学习路线图、源代码、软件安装包等&#xff01;【[点击这里]】&#xff01; PyCharm 是由 JetBrains 打造的一款 Python IDE &#xff08;集成开发环境&#xff0c;Integrated Development Environment&#xff09;&#xff0c;带有一整套可以帮助用户在使用 Py…...

react-native:解决使用webView后部分场景在安卓10崩溃闪退问题

app闪退问题原因&#xff1a; 安卓7以上版本&#xff08;7和7以下版本不会出现闪退&#xff09;&#xff1a;在屏幕不可视区域加载webView或者webView不在可视区域内切换页面时app崩溃闪退&#xff08;在屏幕可视区域加载webView或者webView在可视区域内切换页面不会闪退&…...

大数据工具 flume 的安装配置与使用 (详细版)

参考网址&#xff1a;Flume 1.9用户手册中文版 — 可能是目前翻译最完整的版本了 1&#xff0c;上传安装包 安装包链接&#xff1a;文件下载-奶牛快传 Download &#xff5c;CowTransfer 口令&#xff1a;x8bhcg 1&#xff0c;切换盘符到安装目录 cd /opt/moudles 解压文件…...