c++用户管理信息(双向链表 -- 模板化)

c++用户管理信息---双向链表

  • ListStu双向链表--(把前面的单链表改一下,就直接可以用)
    • ListStu.h
    • ListStu.cpp
  • 模板化

ListStu双向链表–(把前面的单链表改一下,就直接可以用)

ListStu.h

#pragma once
#include "ClassStu.h"class ListStu
{
public:struct StuNode{ClassStu m_cStu;//数据StuNode* m_pPro;//指向前一个节点StuNode* m_pNext;//指向下一个节点StuNode(){m_cStu = 0;m_pNext = nullptr;m_pPro = nullptr;}StuNode(ClassStu& Stu){m_cStu = Stu;m_pNext = nullptr;m_pPro = nullptr;}};using pStuNode = StuNode*;
public://迭代器类class Iterator{public:Iterator(pStuNode Current,pStuNode Head, pStuNode Vail){m_Current = Current;m_Head = Head;m_Vail = Vail;}ClassStu& operator*(){return m_Current->m_cStu;}Iterator& operator++(){if (m_Current == nullptr)//不能是空{return *this;}if (m_Current == m_Vail)//不能是尾部节点{return *this;}m_Current = m_Current->m_pNext;return *this;}Iterator& operator--(){if (m_Current == nullptr){return *this;}if (m_Current == m_Vail){return *this;}m_Current = m_Current->m_pPro;return *this;}bool operator!=(Iterator Itr){return m_Current != Itr.m_Vail;//不等于的时候返回真}private:friend class ListStu;pStuNode m_Current;//当前节点pStuNode m_Head;//头节点pStuNode m_Vail;//尾节点};public:/*******************默认构造系列开始*************************/
/** ListStu* 参数一 : 无* 功能   :默认构造,初始化类成员 --为空* 返回值 :无
*/ListStu();/** ListStu* 参数一 : int* 功能   :默认构造,初始化nCount个成员链表* 返回值 :无
*/ListStu(int nCount);
/** ~ListStu* 参数一 : 无* 功能   :默认析构,释放资源* 返回值 :无
*/~ListStu();/*******************默认构造系列结束*************************///----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------///*******************增删改查系列开始*************************/
/** HeadInsert* 参数一 : ClassStu* 功能   :从头部插入一个数据* 返回值 :ListStu&
*/ListStu& HeadInsert(ClassStu& cStu);/** VailInsert* 参数一 : ClassStu* 功能   :从尾部插入一个数据* 返回值 :ListStu&
*/ListStu& VailInsert(ClassStu& cStu);
/** Insert* 参数一 : pStuNode 需要插入节点的位置   插在这个节点的pStuNode后面* 参数二 : ClassStu& 插入的数据* 功能   : 指定位置插入一个数据* 返回值 : ListStu&
*/ListStu& Insert(Iterator Itr,ClassStu& cStu);/** Detele* 参数一 : pStuNode    删除的前一个节点* 功能   : 从链表中删除一个节点* 返回值 :ListStu&
*/ListStu& Delete(pStuNode PosNode);/** DeteleHead* 参数一 : pStuNode   删除头部节点* 功能   : 删除头部节点* 返回值 : ListStu&
*/ListStu& DeleteHead();/** DeleteVail* 参数一 : pStuNode   删除尾部节点* 功能   : 删除尾部节点* 返回值 : ListStu&
*/ListStu& DeleteVail();
/** DeteleId* 参数一 : 索引* 功能   : 指定索引从链表中删除一个节点* 返回值 : 无
*/ListStu& DeteleId(int nIndex);/** Find* 参数一 : int --序号索引* 功能   : 通过索引查找到数据* 返回值 : 无
*/StuNode* Find(int nIndex);/** FindItr* 参数一 : int --序号索引* 功能   : 查找到数据* 返回值 : Iterator   
*/Iterator FindItr(int nIndex);/** FindFOffset* 参数一 : int --序号索引* 功能   : 根据索引查找到文件偏移* 返回值 : 无
*/int FindFOffset(int nIndex);/** FindId* 参数一 :  int --序号索引* 功能   : 根据索引查找到用户m_Id* 返回值 : 无
*/int FindId(int nIndex);/** UserIdToIndex* 参数一 :  int --用户的m_Id* 功能   : 用户m_Id --查到链表用户的索引* 返回值 : int  nIndex
*/int UserIdToIndex(int UserId);/** UpDate* 参数一 : int --序号索引* 功能   : 修改用户的数据* 返回值 : 无
*/void UpDate(int nIndex,ClassStu& cStu);/*******************增删改查系列结束*************************//*******************迭代器开始*************************/
/** begin* 参数一 : 无* 功能   : 迭代器开始* 返回值 : Iterator
*/Iterator begin(){return Iterator(m_HeaderStu->m_pNext, m_HeaderStu, m_VailStu);}
/** end* 参数一 : 无* 功能   : 迭代器结束* 返回值 : Iterator
*/Iterator end(){return Iterator(m_VailStu, m_HeaderStu, m_VailStu);}/*******************迭代器结束*************************//*******************内部使用函数系列开始*************************/
/** InitDate* 参数一 : int --序号索引* 功能   : 初始化类成员* 返回值 : 无
*/void InitList();/*
* GetMaxUserId
* 参数一 : 无
* 功能   : 查找用户最大的m_Id
* 返回值 : int
*/int GetMaxUserId();/** size* 参数一 : 无* 功能   : 获取元素个数* 返回值 : int
*/int Size();/** BubbleSort* 参数一 : 无* 功能   : 根据成员m_Id --冒泡排序* 返回值 : 无
*///void BubbleSort();/** insertionSort* 参数一 : 无* 功能   : 根据成员m_Id --插入排序法* 返回值 : 无
*///void insertionSort();
/** Sort()* 参数一 : 无* 功能   : 根据成员m_Id --选择性排序法* 返回值 : 无
*/void Sort();/*******************内部使用函数系列结束*************************/private:pStuNode m_HeaderStu;//头节点pStuNode m_VailStu;//尾节点int m_nCount;//记录有多少个成员
};

ListStu.cpp

#include "ListStu.h"ListStu::ListStu()
{InitList();
}ListStu::ListStu(int nCount)
{InitList();for (int i = 0; i < nCount; i++){ClassStu cStu;VailInsert(cStu);}}ListStu::~ListStu()
{//判断是否有成员if (m_nCount == 0){return;}//释放资源//先赋值下一个,在删除当前,以此类推.pStuNode TmpbNode = m_HeaderStu->m_pNext;pStuNode TmpfNode = nullptr;for (int i = 0; i < m_nCount; i++){TmpfNode = TmpbNode->m_pNext;delete TmpbNode;TmpbNode = TmpfNode;}
}ListStu& ListStu::HeadInsert(ClassStu& cStu)
{return Insert(begin(), cStu);
}ListStu& ListStu::VailInsert(ClassStu& cStu)
{return Insert(end(), cStu);
}ListStu& ListStu::Insert(Iterator Itr, ClassStu& cStu)
{if (Itr.m_Current == nullptr){return *this;}auto PosNode = Itr.m_Current;pStuNode ListNode = new StuNode(cStu);PosNode->m_pPro->m_pNext = ListNode;ListNode->m_pPro = PosNode->m_pPro;PosNode->m_pPro = ListNode;ListNode->m_pNext = PosNode;m_nCount++;return *this;
}ListStu& ListStu::Delete(pStuNode PosNode)
{//判断传入的指针是否为空if (PosNode == nullptr){return *this;}//断链  -- 画图PosNode->m_pPro->m_pNext = PosNode->m_pNext;PosNode->m_pNext->m_pPro = PosNode->m_pPro;//释放资源delete PosNode;//元素个数减减m_nCount--;return *this;
}ListStu& ListStu::DeleteHead()
{return Delete(m_HeaderStu->m_pNext);
}ListStu& ListStu::DeleteVail()
{if (m_VailStu->m_pPro == m_HeaderStu){return *this;}return Delete(m_VailStu->m_pPro);
}ListStu& ListStu::DeteleId(int nIndex)
{if (nIndex == 0)//索引为0 就是删除头部{return DeleteHead();}if (nIndex == (m_nCount-1))//索引等于元素个数就是删除尾部{return DeleteVail();}//查找需要删除的节点  pStuNode DeleteNode = Find(nIndex);//进行删除 并返回return Delete(DeleteNode);
}ListStu::StuNode* ListStu::Find(int nIndex)
{//判断 成员个数不为0  nIndex是否有效的值if (m_nCount < 1 ||nIndex < 0 || nIndex > m_nCount){return nullptr;}//遍历查找数据    pStuNode FindNode = m_HeaderStu->m_pNext;for (int i = 0; i < nIndex; i++){FindNode = FindNode->m_pNext;}return FindNode;
}ListStu::Iterator ListStu::FindItr(int nIndex)
{return Iterator(Find(nIndex),m_HeaderStu,m_VailStu);
}int ListStu::FindFOffset(int nIndex)
{pStuNode pFindNode = Find(nIndex);if (pFindNode == nullptr){return 0;}return pFindNode->m_cStu.m_FileOffset;
}int ListStu::FindId(int nIndex)
{pStuNode pFindNode = Find(nIndex);if (pFindNode == nullptr){return 0;}return pFindNode->m_cStu.m_Id;
}int ListStu::UserIdToIndex(int UserId)
{int nIndex = 0;for (auto Val : *this){if (UserId == Val.m_Id){return nIndex;}nIndex++;}return -1;
}void ListStu::UpDate(int nIndex, ClassStu& cStu)
{//先找到要修改的数据pStuNode pUpDate = Find(nIndex);//替换数据   -- cStu里面会自动释放资源pUpDate->m_cStu = cStu;
}void ListStu::InitList()
{m_HeaderStu = new StuNode;m_VailStu = new StuNode;m_HeaderStu->m_pNext = m_VailStu;m_VailStu->m_pPro = m_HeaderStu;m_nCount = 0;
}int ListStu::GetMaxUserId()  //已经排好序的,只要取尾节点的前一个节点的m_Id
{return m_VailStu->m_pPro->m_cStu.m_Id;
}int ListStu::Size()
{return m_nCount;
}void ListStu::Sort()//适合用选择性排序法了{auto nTmp = m_HeaderStu->m_pNext;//第一个节点数据auto cTmp = nTmp->m_pNext;//第二个节点数据for (int i = 0; i < m_nCount - 1; i++){for (int j = 0 + i; j < m_nCount - 1; j++){if ((nTmp->m_cStu.m_Id) > (cTmp->m_cStu.m_Id))//不停的遍历cTmp下一个{//交换数据就好auto nNumber = nTmp->m_cStu;nTmp->m_cStu = cTmp->m_cStu;cTmp->m_cStu = nNumber;}cTmp = cTmp->m_pNext;}nTmp = nTmp->m_pNext;cTmp = nTmp->m_pNext;//重新赋值cTmp为nTmp的下一个节点}}

模板化

#pragma once
template<typename T>
class ListStu
{
public:class StuNode{public:T m_cStu;//数据StuNode* m_pPro;//指向前一个节点StuNode* m_pNext;//指向下一个节点StuNode(){m_cStu = 0;m_pNext = nullptr;m_pPro = nullptr;}StuNode(T& Stu){m_cStu = Stu;m_pNext = nullptr;m_pPro = nullptr;}};using pStuNode = StuNode*;
public://迭代器类class Iterator{public:Iterator(pStuNode Current,pStuNode Head, pStuNode Vail){m_Current = Current;m_Head = Head;m_Vail = Vail;}ClassStu& operator*(){return m_Current->m_cStu;}Iterator& operator++(){if (m_Current == nullptr)//不能是空{return *this;}if (m_Current == m_Vail)//不能是尾部节点{return *this;}m_Current = m_Current->m_pNext;return *this;}Iterator& operator--(){if (m_Current == nullptr){return *this;}if (m_Current == m_Vail){return *this;}m_Current = m_Current->m_pPro;return *this;}bool operator!=(Iterator Itr){return m_Current != Itr.m_Vail;//不等于的时候返回真}private:friend class ListStu;pStuNode m_Current;//当前节点pStuNode m_Head;//头节点pStuNode m_Vail;//尾节点};public:using pStuNode = StuNode*;/*******************默认构造系列开始*************************/
/** ListStu* 参数一 : 无* 功能   :默认构造,初始化类成员 --为空* 返回值 :无
*/ListStu(){InitList();}/** ListStu* 参数一 : int* 功能   :默认构造,初始化nCount个成员链表* 返回值 :无
*/ListStu(int nCount){InitList();for (int i = 0; i < nCount; i++){ClassStu cStu;VailInsert(cStu);}}
/** ~ListStu* 参数一 : 无* 功能   :默认析构,释放资源* 返回值 :无
*/~ListStu(){//判断是否有成员if (m_nCount == 0){return;}//释放资源//先赋值下一个,在删除当前,以此类推.pStuNode TmpbNode = m_HeaderStu->m_pNext;pStuNode TmpfNode = nullptr;for (int i = 0; i < m_nCount; i++){TmpfNode = TmpbNode->m_pNext;delete TmpbNode;TmpbNode = TmpfNode;}}/*******************默认构造系列结束*************************///----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------///*******************增删改查系列开始*************************/
/** HeadInsert* 参数一 : ClassStu* 功能   :从头部插入一个数据* 返回值 :ListStu&
*/ListStu<T>& HeadInsert(T& cStu){return Insert(begin(), cStu);}/** VailInsert* 参数一 : ClassStu* 功能   :从尾部插入一个数据* 返回值 :ListStu&
*/ListStu<T>& VailInsert(T& cStu){return Insert(end(), cStu);}
/** Insert* 参数一 : pStuNode 需要插入节点的位置   插在这个节点的pStuNode后面* 参数二 : ClassStu& 插入的数据* 功能   : 指定位置插入一个数据* 返回值 : ListStu&
*/ListStu<T>& Insert(Iterator Itr, T& cStu){if (Itr.m_Current == nullptr){return *this;}auto PosNode = Itr.m_Current;pStuNode ListNode = new StuNode(cStu);PosNode->m_pPro->m_pNext = ListNode;ListNode->m_pPro = PosNode->m_pPro;PosNode->m_pPro = ListNode;ListNode->m_pNext = PosNode;m_nCount++;return *this;}/** Detele* 参数一 : pStuNode    删除的前一个节点* 功能   : 从链表中删除一个节点* 返回值 :ListStu&
*/ListStu<T>& Delete(pStuNode PosNode){//判断传入的指针是否为空if (PosNode == nullptr){return *this;}//断链  -- 画图PosNode->m_pPro->m_pNext = PosNode->m_pNext;PosNode->m_pNext->m_pPro = PosNode->m_pPro;//释放资源delete PosNode;//元素个数减减m_nCount--;return *this;}/** DeteleHead* 参数一 : pStuNode   删除头部节点* 功能   : 删除头部节点* 返回值 : ListStu&
*/ListStu<T>& DeleteHead(){return Delete(m_HeaderStu->m_pNext);}/** DeleteVail* 参数一 : pStuNode   删除尾部节点* 功能   : 删除尾部节点* 返回值 : ListStu&
*/ListStu<T>& DeleteVail(){if (m_VailStu->m_pPro == m_HeaderStu){return *this;}return Delete(m_VailStu->m_pPro);}
/** DeteleId* 参数一 : 索引* 功能   : 指定索引从链表中删除一个节点* 返回值 : 无
*/ListStu<T>& DeteleId(int nIndex){if (nIndex == 0)//索引为0 就是删除头部{return DeleteHead();}if (nIndex == (m_nCount - 1))//索引等于元素个数就是删除尾部{return DeleteVail();}//查找需要删除的节点  pStuNode DeleteNode = Find(nIndex);//进行删除 并返回return Delete(DeleteNode);}/** Find* 参数一 : int --序号索引* 功能   : 通过索引查找到数据* 返回值 : 无
*/pStuNode Find(int nIndex){//判断 成员个数不为0  nIndex是否有效的值if (m_nCount < 1 || nIndex < 0 || nIndex > m_nCount){return nullptr;}//遍历查找数据    pStuNode FindNode = m_HeaderStu->m_pNext;for (int i = 0; i < nIndex; i++){FindNode = FindNode->m_pNext;}return FindNode;}/** FindItr* 参数一 : int --序号索引* 功能   : 查找到数据* 返回值 : Iterator   
*/Iterator FindItr(int nIndex){return Iterator(Find(nIndex), m_HeaderStu, m_VailStu);}/** FindFOffset* 参数一 : int --序号索引* 功能   : 根据索引查找到文件偏移* 返回值 : 无
*/int FindFOffset(int nIndex){pStuNode pFindNode = Find(nIndex);if (pFindNode == nullptr){return 0;}return pFindNode->m_cStu.m_FileOffset;}/** FindId* 参数一 :  int --序号索引* 功能   : 根据索引查找到用户m_Id* 返回值 : 无
*/int FindId(int nIndex){pStuNode pFindNode = Find(nIndex);if (pFindNode == nullptr){return 0;}return pFindNode->m_cStu.m_Id;}/** UserIdToIndex* 参数一 :  int --用户的m_Id* 功能   : 用户m_Id --查到链表用户的索引* 返回值 : int  nIndex
*/int UserIdToIndex(int UserId){int nIndex = 0;for (auto Val : *this){if (UserId == Val.m_Id){return nIndex;}nIndex++;}return -1;}/** UpDate* 参数一 : int --序号索引* 功能   : 修改用户的数据* 返回值 : 无
*/void UpDate(int nIndex, ClassStu& cStu){//先找到要修改的数据pStuNode pUpDate = Find(nIndex);//替换数据   -- cStu里面会自动释放资源pUpDate->m_cStu = cStu;}/*******************增删改查系列结束*************************//*******************迭代器开始*************************/
/** begin* 参数一 : 无* 功能   : 迭代器开始* 返回值 : Iterator
*/Iterator begin(){return Iterator(m_HeaderStu->m_pNext, m_HeaderStu, m_VailStu);}
/** end* 参数一 : 无* 功能   : 迭代器结束* 返回值 : Iterator
*/Iterator end(){return Iterator(m_VailStu, m_HeaderStu, m_VailStu);}/*******************迭代器结束*************************//*******************内部使用函数系列开始*************************/
/** InitDate* 参数一 : int --序号索引* 功能   : 初始化类成员* 返回值 : 无
*/void InitList(){m_HeaderStu = new StuNode;m_VailStu = new StuNode;m_HeaderStu->m_pNext = m_VailStu;m_VailStu->m_pPro = m_HeaderStu;m_nCount = 0;}/*
* GetMaxUserId
* 参数一 : 无
* 功能   : 查找用户最大的m_Id
* 返回值 : int
*/int GetMaxUserId(){return m_VailStu->m_pPro->m_cStu.m_Id;}/** size* 参数一 : 无* 功能   : 获取元素个数* 返回值 : int
*/int Size(){return m_nCount;}/** BubbleSort* 参数一 : 无* 功能   : 根据成员m_Id --冒泡排序* 返回值 : 无
*///void BubbleSort();/** insertionSort* 参数一 : 无* 功能   : 根据成员m_Id --插入排序法* 返回值 : 无
*///void insertionSort();
/** Sort()* 参数一 : 无* 功能   : 根据成员m_Id --选择性排序法* 返回值 : 无
*/void Sort(){auto nTmp = m_HeaderStu->m_pNext;//第一个节点数据auto cTmp = nTmp->m_pNext;//第二个节点数据for (int i = 0; i < m_nCount - 1; i++){for (int j = 0 + i; j < m_nCount - 1; j++){if ((nTmp->m_cStu.m_Id) > (cTmp->m_cStu.m_Id))//不停的遍历cTmp下一个{//交换数据就好auto nNumber = nTmp->m_cStu;nTmp->m_cStu = cTmp->m_cStu;cTmp->m_cStu = nNumber;}cTmp = cTmp->m_pNext;}nTmp = nTmp->m_pNext;cTmp = nTmp->m_pNext;//重新赋值cTmp为nTmp的下一个节点}}/*******************内部使用函数系列结束*************************/private:pStuNode m_HeaderStu;//头节点pStuNode m_VailStu;//尾节点int m_nCount;//记录有多少个成员
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/701343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解Spring Boot Starter Integration的用途与优势

Spring Boot Starter Integration 是 Spring Boot 提供的一个强大的集成框架&#xff0c;用于简化和加速在 Spring Boot 项目中集成不同的消息传递、数据转换和系统集成组件。本文将介绍 Spring Boot Starter Integration 的主要用途以及其在简化集成过程中的优势。 1. Spring…

前端导出下载文件后提示无法打开文件

问题 项目中的导出文件功能&#xff0c;导出下载后的文件打开提示如下&#xff1a; 原因 对返回的响应数据进行打印&#xff0c;发现响应数据为字符串格式&#xff0c;前期规划的后端返回数据应该 blob 对象的。后经排查后发现是请求头缺少了响应数据格式的配置&#xff0c;应…

#FPGA(IRDA)

1.IDE:Quartus II 2.设备&#xff1a;Cyclone II EP2C8Q208C8N 3.实验&#xff1a;IRDA&#xff08;仿真接收一个来自0x57地址的数据0x22 (十进制34)&#xff09; 4.时序图&#xff1a; 5.步骤 6.代码&#xff1a; irda_receive.v module irda_receive ( input wire…

从故宫修建看「软件物料清单」的重要性 @安全历史01

故宫&#xff0c;这座中国传统文化的重要代表和象征性建筑已屹立近600年&#xff0c;是世界上现存规模最大、保存最为完整的木质结构古建筑之一。 故宫之所以能至今保存完好&#xff0c;除持续保护和修缮外&#xff0c;其使用的木材和砖石等材料也经过了精挑细选&#xff0c;保…

C++函数对象-运算符函数对象 - 旧式绑定器与适配器 - 从成员函数指针创建包装器,可以一个对象指针调用 (std::mem_fun)

任何定义了函数调用操作符的对象都是函数对象。C 支持创建、操作新的函数对象&#xff0c;同时也提供了许多内置的函数对象。 旧式绑定器与适配器 早期提供功能支持的几个工具在 C11 中弃用&#xff0c;并于 C17 中移除&#xff08;旧否定器于 C17 中弃用并于 C20 中移除&#…

IOBR2 更新(学习自备)

IOBR查看其收录的相关基因集(自备)_肿瘤 tme特征 iobr-CSDN博客 IOBR2&#xff1a;多维度解析肿瘤微环境 - 知乎 (zhihu.com) 学习手册&#xff1a;https://iobr.github.io/book/ &#xff08;里面有详细教程&#xff09; 系统综合的分析工具&#xff08;Immuno-Oncology Bi…

渗透工具——kali中wpscan简介

一、什么是wpscan 1、常用于做用户名枚举爆破 2、WPScan是一个扫描 WordPress 漏洞的黑盒子扫描器&#xff0c;它可以为所有 Web 开发人员扫描 WordPress 漏洞并在他们开发前找到并解决问题。我们还使用了 Nikto &#xff0c;它是一款非常棒的Web 服务器评估工具&#xff0c;…

神经网络系列---独热编码(One-Hot Encoding)

文章目录 独热编码&#xff08;One-Hot Encoding&#xff09; 独热编码&#xff08;One-Hot Encoding&#xff09; 是一种常用的数据预处理技术&#xff0c;用于将分类变量转换为计算机易于处理的二进制格式。在机器学习和数据分析中&#xff0c;我们通常会遇到非数值型的特征…

深入浅出JVM(九)之字节码指令(上篇)

本篇文章主要围绕字节码的指令&#xff0c;深入浅出的解析各种类型字节码指令&#xff0c;如&#xff1a;加载存储、算术、类型转换、对象创建与访问、方法调用与返回、控制转义、异常处理、同步等 由于字节码指令种类太多&#xff0c;本文作为上篇概述加载存储、算术、类型转…

IT廉连看——C语言——操作符

IT廉连看—操作符 c语言中有许多操作符&#xff0c;可以用于对变量进行各种不同的操作 一、算术操作符 - * / % 除了 % 操作符之外&#xff0c;其他的几个操作符可以作用于整数和浮点数。 对于 / 操作符如果两个操作数都为整数&#xff0c;执行整数除法。而只要有浮点…

vue+nodejs+uniapp婚纱定制婚庆摄影系统 微信小程序 springboot+python

目前移动互联网大行其道&#xff0c;人人都手中拿着智能机&#xff0c;手机手机&#xff0c;手不离机&#xff0c;如果开发一个用在手机上的程序软件&#xff0c;那是多么的符合潮流&#xff0c;符合管理者和客户的理想。本次就是开发婚庆摄影小程序&#xff0c;有管理员&#…

基础光学系列:(三)揭秘机器视觉中的光圈、焦距与景深的作用

​今天来聊聊成像原理、光圈、焦距和景深&#xff0c;这些概念在摄影、摄像以及机器视觉领域都非常重要。它们共同影响着成像设备捕捉图像的质量和特性。让我们一一解析这些概念以及它们如何在机器视觉行业中应用。 成像原理&#xff1a;怎样把外面的世界捕捉进来 想象一下&a…

大厂面试-美团高频考察算法之重排链表

本文学习目标或巩固的知识点 学习如何处理链表重排类题目 巩固反转链表巩固快慢指针巩固合并链表 提前说明&#xff1a;算法题目来自力扣、牛客等等途径 &#x1f7e2;表示简单 &#x1f7e1;表示中等 &#x1f534;表示困难 &#x1f92e;表示恶心 博主真实经历&#xff0c;…

前后端分离Vue+ElementUI+nodejs蛋糕甜品商城购物网站95m4l

本文主要介绍了一种基于windows平台实现的蛋糕购物商城网站。该系统为用户找到蛋糕购物商城网站提供了更安全、更高效、更便捷的途径。本系统有二个角色&#xff1a;管理员和用户&#xff0c;要求具备以下功能&#xff1a; &#xff08;1&#xff09;用户可以修改个人信息&…

LabVIEW储氢材料循环寿命测试系统

LabVIEW储氢材料循环寿命测试系统 随着氢能技术的发展&#xff0c;固态储氢技术因其高密度和安全性成为研究热点。储氢材料的循环寿命是衡量其工程应用的关键。然而&#xff0c;传统的循环寿命测试设备存在成本高、测试效率低、数据处理复杂等问题。设计了一种基于LabVIEW软件…

uniapp 使用 z-paging组件

使用 z-paging 导入插件 获取插件进行导入 自定义上拉加载样式和下拉加载样式 页面结构 例子 搭建页面 <template><view class"content"><z-paging ref"paging" v-model"dataList" query"queryList"><templ…

记录 | docker基本操作

重命名镜像 docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库&#xff1a;标签)# 例子 docker tag ca1b6b825289 registry.cn-hangzhou.aliyuncs.com/xxxxxxx:v1.0 启动 docker cuda docker hub 地址&#xff1a; https://hub.docker.com/r/nvidia/cuda/tags/?page1&na…

蓝桥杯倒计时48天!二分模板

倒计时48天&#xff01; 二分 二分模板 判断是否可以二分 &#xff08;1&#xff09;单调性 备选答案集是有序的 &#xff08;2&#xff09;二段性 在检查了mid是否符合要求之和&#xff0c;我可以舍弃mid左右某一边的答案 两个模板 关键词&#xff1a;满足条件的最小值…

【每日前端面经】2023-02-24

题目来源: 牛客 对Vue的理解 Vue是一款流行的JS前端框架&#xff0c;关注的核心是MVC模式的视图层&#xff0c;能够简化数据更新 Vue的核心是数据驱动、组件化和指令系统 数据驱动: 分为模型层、视图层和视图模型层组件化: 可以把各种逻辑封装进统一组件进行复用指令系统: 当…

【VSCode】SSH Remote 通过跳板机连开发机提示“bash行1 powershell未找到命令”

需求背景 因为需要&#xff0c;在家我需要挂上公司VPN然后SSH连到跳板机&#xff0c;然后再从跳板机SSH进开发机。 问题背景 跳板机进开发机输入完密码显示 bash行1 powershell未找到命令VSCode SSH Remote跳板机配置请自行搜素其他文章config配置 注意其中ssh.exe地址请根据…