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

【C++初阶】--- list容器功能模拟实现

1.什么是list容器

在 C++ 标准模板库(STL)中,std::list 是一个非常有用的容器,它是双向链表的实现std::list 是一种序列式容器,它允许在序列内的任意位置进行高效的插入和删除操作。与数组和 std::vector 不同,std::list 中的元素在内存中并不是连续存储的,而是通过指针相互连接,形成一个双向链表。

2.需要创建的三个必要类模板

// 1.节点模板
template<class T>
struct list_node
{//成员变量T _data;list_node<T>* _next;list_node<T>* _prev;
};// 2.迭代器模板
template<class T, class Ref, class Ptr>
struct list_iterator
{typedef list_node<T> Node;typedef list_iterator<T, Ref ,Ptr> Self;//成员变量Node* _node;
};// 3.链表模板
template<class T>
class list
{typedef list_node<T> Node;
public:typedef list_iterator<T, T&, T*> iterator;typedef list_iterator<T, const T&, const T*> const_iterator;private://成员变量包括哨兵位和链表长度Node* _head;size_t _size;
};

3.节点类模板

list容器底层是一个双向带头循环链表,所以节点类模板中有三个成员变量:data用于存储数据,next是指向下一个节点的指针,prev是指向前一个节点的指针。
节点类模板我们只需要实现一个默认构造用于构造出一个哨兵位即可,后续插入删除等操作在链表类模板中实现

template<class T>
struct list_node
{//成员变量T _data;list_node<T>* _next;list_node<T>* _prev;
};

3.1默认构造

//默认构造
list_node(const T& data = T())//T()匿名对象,内置类型一样有:_data(data), _next(nullptr), _prev(nullptr)
{}

4.迭代器类模板

我们模拟实现的迭代器底层是一个指向节点指针,所以有一个成员变量Node* _node

template<class T, class Ref, class Ptr>
struct list_iterator
{typedef list_node<T> Node;typedef list_iterator<T, Ref ,Ptr> Self;//成员变量Node* _node;
};

我们参考一下以下代码,我们要实现迭代器模板的原因是因为我们要对迭代器变量it进行++、–、*(解引用)、==、!=等操作,我们对it进行++操作的时候我们希望的是it能够指向下一个节点,对it进行解引用操作时我们希望能够取到节点中的数据,但因为链表中的数据不是连续存储的,所以这些操作符达到的实际效果与我们预期效果不符,所以我们要对这些运算符进行重载,使其能够达到我们实际的预期效果。

auto it = con.begin();
while (it != con.end())
{cout << *it << " ";it++;
}
cout << endl;

4.1operator*

这里的Ref我们之后传T&,即返回引用

Ref operator*()
{return _node->_data;
}

4.2operator->

Ptr后续传的是T*

//返回的是指针
Ptr operator->()
{return &(_node->_data);
}

重载这个运算符的原因是我们可以进行以下操作:

struct AA
{int _a1;int _a2;
};
list<AA> lta;
lta.push_back(AA());
lta.push_back(AA());
lta.push_back(AA());
lta.push_back(AA());list<AA>::iterator ita = lta.begin();
while (ita != lta.end())
{//特殊处理,本来应该是两个->才合理,为了可读性,省略了一个->//cout << ita.operator->()->_a1 << ":" << ita.operator->()->_a2 << endl;cout << ita->_a1 << ":" << ita->_a2 << endl;ita++;
}

4.3前置++、–

//前置
Self& operator++()
{_node = _node->_next;return *this;//即返回节点
}Self& operator--()
{_node = _node->_prev;return *this;
}

4.4后置++、–

后置++、–返回的是临时变量,但实际值会改变

//后置
Self& operator++(int)
{Node* tmp(_node);_node = _node->_next;return *this;
}Self& operator--(int)
{Node* tmp(_node);_node = _node->_prev;return *this;
}

4.5operator==/operator!=

是否相同比较的是地址

bool operator!=(const Self& s) const
{return _node != s._node;
}bool operator==(const Self& s) const
{return _node == s._node;
}

5.链表类模板

链表类模板有两个成员变量:_head是指向链表哨兵位的指针,_size用于记录链表的长度。

// 3.链表模板
template<class T>
class list
{typedef list_node<T> Node;
public:typedef list_iterator<T, T&, T*> iterator;typedef list_iterator<T, const T&, const T*> const_iterator;private://成员变量包括哨兵位和链表长度Node* _head;size_t _size;
};

5.1迭代器

begin()返回的是指向链表哨兵位后一个节点的迭代器,end()返回的是指向哨兵位的迭代器。

iterator begin()
{//有名对象/*iterator it(_head->_next);return it;*///匿名对象//return iterator(_head->_next);//单参数构造函数支持隐式类型转换return _head->_next;
}iterator end()
{return _head;
}

5.2const迭代器

const_iterator begin() const
{return _head->_next;
}const_iterator end() const
{return _head;
}

const迭代器给const对象使用,如以下模板可以使用

//打印数据通用模板
template<class Container>
void print_Container(const Container& con)
{//去未实例化的类里面取东西,不知道是类型还是变量,加上typename说明是类型//typename Container::const_iterator it = con.begin();auto it = con.begin();while (it != con.end()){//*it += 10;cout << *it << " ";it++;}cout << endl;
}

5.3空初始化empty_init()

空初始化即初始化一个空链表,空链表只包含一个哨兵位。

//空初始化
void empty_init()
{_head = new Node;_head->_next = _head;_head->_prev = _head;_size = 0;
}

5.4在pos位置插入节点insert()

在pos尾插插入数据需要传pos位置的迭代器,然后我们构造一个值位x的节点,改变相关节点前后指针的指向实现pos位置的插入

//在pos位置之前插入数据
void insert(iterator pos, const T& x)
{//申请新节点Node* newnode = new Node(x);Node* cur = pos._node;Node* prev = cur->_prev;//cur->prev、newnode、curnewnode->_next = cur;newnode->_prev = prev;cur->_prev = newnode;prev->_next = newnode;++_size;
}

5.5删除pos维持节点erase()

删除pos位置节点需要传pos位置得迭代器,注意不能删除哨兵位,然后我们改变相关节点前后指针的指向实现删除。

//删除pos位置数据
iterator erase(iterator pos)
{//不能删除哨兵位assert(pos != end());//pos->prev、pos->nextNode* next = pos._node->_next;Node* prev = pos._node->_prev;prev->_next = next;next->_prev = prev;delete pos._node;--_size;return next;
}

5.6尾插push_back()

往链表中尾插一个节点我们可以选择先构造一个新节点,然后改变相关节点前后指针的指向实现尾插,也可以选择复用insert传尾节点的迭代器实现尾插。

//尾插
//方法1
void push_back(const T& x)
{//申请新节点,用x构造一个节点Node* newnode = new Node(data);Node* tail = _head->_prev;//tail、newnode、tail->next(_head)tail->_next = newnode;newnode->_prev = tail;newnode->_next = _head;_head->_prev = newnode;++_size;
}//方法2
void push_back(const T& x)
{insert(end(), x);
}

5.7头插push_front()

头插是插入至哨兵位后面。头插可以选择直接复用insert传头节点的迭代器实现,也可以想上面的尾插一样改变相关节点前后指针的指向实现头插

//头插
void push_front(const T& x)
{//_head、newnode、_head->nextinsert(begin(), x);
}

5.8尾删pop_back()

尾删我们直接复用erase,传尾节点的迭代器实现删除

//尾删
void pop_back()
{erase(--end());
}

5.9头删pop_front()

头删我们直接复用erase,传头节点的迭代器实现删除

//头删
void pop_front()
{erase(begin());
}

5.10size()和empty()

size()用于返回链表的长度,empty()用于判断链表是否为空

size_t size() const
{return _size;
}bool empty() const
{return _size == 0;
}

5.11构造函数

5.11.1默认构造

默认构造即构造一个哨兵位,我们可以复用空初始化。

//默认构造(哨兵位)
list()
{empty_init();
}

5.11.2拷贝构造

拷贝构造我们可以复用空初始化先给个哨兵位,然后使用范围for将节点一个一个尾插至链表中

//拷贝构造
list(const list<T>& lt)
{//先给个哨兵位empty_init();for (auto e : lt){push_back(e);}
}

6.打印数据的通用模板

通用模板我们传的是const对象,会调用const迭代器。
这里有一点需要注意,就是模板有个特性:按需实例化,即如果我们没有将这个模板实例化的话,如果这个模板中没有明显的语义错误,编译器是不会报错的,比如下面的打印模板,我们打印的是const对象,我们对const对象只有读的权限,我们不能对其进行修改,比如*it += 10,正常这样是会报错的,但因为这是在模板中写的,也就是说只有当模板被实例化后,编译器才会报错。

//按需实例化
template<class Container>
void print_Container(const Container& con)
{//去未实例化的类里面取东西,不知道是类型还是变量,加上typename说明是类型//typename Container::const_iterator it = con.begin();auto it = con.begin();while (it != con.end()){//*it += 10;cout << *it << " ";it++;}cout << endl;
}

相关文章:

【C++初阶】--- list容器功能模拟实现

1.什么是list容器 在 C 标准模板库&#xff08;STL&#xff09;中&#xff0c;std::list 是一个非常有用的容器&#xff0c;它是双向链表的实现std::list 是一种序列式容器&#xff0c;它允许在序列内的任意位置进行高效的插入和删除操作。与数组和 std::vector 不同&#xff…...

gRPC 介绍及在嵌入式 Linux 下的成功编译及使用详解

gRPC 是一个高性能、开源和通用的 RPC 框架&#xff0c;由 Google 开发。它支持多种编程语言&#xff0c;并且能够运行在不同的环境中&#xff0c;包括嵌入式系统。本文将详细介绍 gRPC&#xff0c;以及如何在嵌入式 Linux 系统下成功编译 gRPC&#xff0c;并结合 protobuf 和 …...

C语言教程(十):C 语言函数详解

一、引言 在 C 语言中&#xff0c;函数是一组执行特定任务的代码块。通过将复杂的程序逻辑划分为多个函数&#xff0c;不仅能提高代码的可读性、可维护性&#xff0c;还便于代码的复用。无论是简单的数学计算&#xff0c;还是复杂的系统操作&#xff0c;函数都发挥着核心作用。…...

力扣刷题-热题100题-第35题(c++、python)

146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/lru-cache/?envTypestudy-plan-v2&envIdtop-100-liked 双向链表哈希表 内置函数 对于c有list可以充当双向链表&#xff0c;unordered_map充当哈希表&#xff1b;python有OrderedDic…...

LeetCode算法题(Go语言实现)_52

题目 给你一个下标从 0 开始的整数数组 costs &#xff0c;其中 costs[i] 是雇佣第 i 位工人的代价。 同时给你两个整数 k 和 candidates 。我们想根据以下规则恰好雇佣 k 位工人&#xff1a; 总共进行 k 轮雇佣&#xff0c;且每一轮恰好雇佣一位工人。 在每一轮雇佣中&#xf…...

基于尚硅谷FreeRTOS视频笔记——13—HAL库和RTOS时钟源问题

RTOS的时钟源就是系统定时器中断&#xff0c;通俗来说就是系统定时器每中断一次&#xff0c;就扫描一次RTOS&#xff0c;查看RTOS中有没有任务的切换。 但是&#xff0c;系统存在一个HAL_Delay()函数&#xff0c;就是使用的系统定时器中断来执行的函数。 当我们在RTOS中&…...

FPGA入门学习Day1——设计一个DDS信号发生器

目录 一、DDS简介 &#xff08;一&#xff09;基本原理 &#xff08;二&#xff09;主要优势 &#xff08;三&#xff09;与传统技术的对比 二、FPGA存储器 &#xff08;一&#xff09;ROM波形存储器 &#xff08;二&#xff09;RAM随机存取存储器 &#xff08;三&…...

JavaScript-立即执行函数(Immediately Invoked Function Expression,IIFE)

立即执行函数&#xff08;Immediately Invoked Function Expression&#xff0c;IIFE&#xff09;是 JavaScript 里一种很独特的函数&#xff0c;它在定义后会马上执行。下面会详细介绍它的语法、用途、优点以及注意事项。 一、语法 立即执行函数一般有两种常见的语法形式&am…...

【Leetcode 每日一题 - 补卡】2537. 统计好子数组的数目

问题背景 给你一个整数数组 n u m s nums nums 和一个整数 k k k&#xff0c;请你返回 n u m s nums nums 中 好 子数组的数目。 一个子数组 a r r arr arr 如果有 至少 k k k 对下标 ( i , j ) (i, j) (i,j) 满足 i < j i < j i<j 且 a r r [ i ] a r r [ …...

【工具-Krillin AI】视频翻译、配音、语音克隆于一体的一站式视频多语言转换工具~

Krillin AI 是全能型音视频本地化与增强解决工具。这款简约而强大的工具&#xff0c;集音视频翻译、配音、语音克隆于一身&#xff0c;支持横竖屏格式输出&#xff0c;确保在所有主流平台&#xff08;哔哩哔哩&#xff0c;小红书&#xff0c;抖音&#xff0c;视频号&#xff0c…...

常用绑定事件方式有哪几种

绑定事件分为3种&#xff1a; 1、内联模式&#xff1a;将函数名直接作为标签属性的属性值&#xff08;注意&#xff1a;这里是带括号的,不带括号不生效&#xff0c;但是在vue中可以加括号也可以不加括号&#xff0c;如果需要穿参数就加括号&#xff0c;不需要传参数可以不加&am…...

数据结构之BFS广度优先算法(腐烂的苹果)

队列这个数据结构在很多场景下都有使用&#xff0c;比如在实现二叉树的层序遍历&#xff0c;floodfill问题(等等未完成)中&#xff0c;都需要借助队列的先进先出特性&#xff0c;下面给出这几个问题的解法 经典的二叉树的层序遍历 算法图示&#xff0c;以下图所示的二叉树为例…...

linux 学习 1.开始学习

准备学习linux记录一下学习内容&#xff0c;只会包含必要的知识&#xff0c;和部分演示 我采用的系统是Ubuntu24.04 初始掌握 学习首先需要掌握如何查看帮助手册 man man # man 加任何命令可以看具体命令的帮助手册 man mkdir进入手册按 d(down)&#xff1a;往下翻半页u(u…...

Flink-01学习 介绍Flink及上手小项目之词频统计

flink简介 官网 概述&#xff1a; 学习Flink具体包括四个关键概念&#xff1a;流数据的持续处理&#xff0c;事件时间&#xff0c;有状态流处理和状态快照。 Apache Flink 是一个开源的流处理框架&#xff0c;旨在处理批处理和实时数据处理&#xff0c;具有高吞吐量和低延迟的…...

【Linux我做主】探秘gcc/g++和动静态库

TOC Linux编译器gcc/g的使用 github地址 有梦想的电信狗 前言 在软件开发的世界中&#xff0c;编译器如同匠人的工具&#xff0c;将人类可读的代码转化为机器执行的指令。 对于Linux开发者而言&#xff0c;gcc和g是构建C/C程序的核心工具链&#xff0c;掌握它们的原理和使…...

工控系统前端设计(pyqt)

题目源自&#xff1a;白月黑羽的项目实战四-[工控系统前端] 代码已上传至gitcode https://gitcode.com/m0_37662818/Industrial_Control_System_Front_End 心得体会&#xff1a;直接用组态软件或者js吧 项目亮点 tablemodel的使用&#xff0c;绑定了表格和数据风机自定义ite…...

一台 Master 多节点玩转 Kubernetes:sealos 一键部署实践

文章目录 一台 Master 多节点玩转 Kubernetes&#xff1a;sealos 一键部署实践&#x1f517; 参考链接&#x1f310; 部署环境&#x1f4e6; 安装包说明&#x1f527; 前期准备&#x1f680; 使用 sealos 安装 Kubernetes✅ 验证集群状态&#x1f4cc; 后续可做的优化和拓展&am…...

写书的三驾马车

2019年8月19日23:52:28 先亮出我们的兵器组合&#xff1a; GitBook Git Markdown&#xff0c;享受行云流水一般的写作 个人秀 GitBook : 一个基于 Node.js 的文档格式转换工具&#xff0c;支持 Markdown 和 AsciiDoc 两种语法格式&#xff0c;可以输出 HTML、PDF等格式的…...

科学护理进行性核上性麻痹,缓解病痛提升生活质量

进行性核上性麻痹是一种罕见的神经系统变性疾病&#xff0c;患者常出现姿势平衡障碍、吞咽困难、眼球运动异常等症状。通过科学的健康护理&#xff0c;能在一定程度上减轻患者痛苦&#xff0c;提升生活质量。 日常护理&#xff0c;保障安全舒适 患者日常活动时&#xff0c;需确…...

第七章:7.2求方程a*x*x+b*x+c=0的根,用3个函数,分别求当:b*b-4*a*c大于0、等于0和小于0时的根并输出结果。从主函数输入a、b、c的值

//求方程a*x*xb*xc0的根&#xff0c;用3个函数&#xff0c;分别求当&#xff1a;b*b-4*a*c大于0、等于0和小于0时的根并输出结果。 //从主函数输入a、b、c的值 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<math.h> void s1(float a, float b, fl…...

优选算法系列(7.BFS 解决最短路问题)

简介&#xff1a; 先走到A&#xff0c;之后弹出A再把A能走到的地方加进去向外扩展把队列里面的元素&#xff08;B&#xff0c;C&#xff09;弹出来&#xff0c;再把B&#xff0c;C能到的地方入队列 一直这样那么最短路程就是扩展的层数。 迷宫中离入口最近的出口&#xff08;me…...

实现定时发送邮件,以及时间同步

定时发送邮件 部署邮件服务 查看有没有安装mailx,安装了 [root192 ~]# rpm -q mailx mailx-12.5-43.fc38.x86_64去网易拿一下授权码,写到配置文件里 vim /etc/mail.rcset fromxxxxxxx163.com set smtpsmtp.163.com set smtp-auth-userxxxxxxx163.com set smtp-auth-passwor…...

Java反射知识点学习笔记

目录 一、定义 二、获取class对象的三种方式 1、Class.forName("全类名") 2、类名.class 3、对象.getClass() 三、案例 1、获取 class 反射对象三种方式 2、利用反射获取构造方法 3、利用反射获取成员变量 4、利用反射获取成员方法 Java反射是一种强大的编…...

Unity ShaderLab引用HLSL文件找不到其中函数

在写Unity Shader的过程中&#xff0c;常常需要将方法封装到HLSL文件中&#xff0c;今天遇到一个这样的报错&#xff0c; 明明hlsl文件路径引用没问题&#xff0c;却引用不到方法 并且将分散文件中的函数复制过来一切正常&#xff0c;最终定位到HLSL的预编译指令中 这指令的…...

【文献笔记】LLM-based control code generation using image recognition

LLM-based control code generation using image recognition 原文代码 标题翻译&#xff1a;基于图像识别的LLM控制代码生成 1. 内容介绍 1.1. 简介 论文提出了一种基于LLM的新方法&#xff0c;通过图像识别从管道仪表图&#xff08;Piping and Instrumentation Diagrams,…...

算法之贪心算法

贪心算法 贪心算法核心思想常见应用场景典型案例案例一&#xff1a;找零问题案例二&#xff1a;活动选择问题案例三&#xff1a;货仓选址问题 贪心算法的应用详解霍夫曼编码最小生成树Dijkstra最短路径算法 总结 贪心算法 核心思想 贪心算法&#xff08;Greedy Algorithm&…...

从“链主”到“全链”:供应链数字化转型的底层逻辑

1. 制造业与供应链数字化转型的必然性 1.1. 核心概念与战略重要性 制造业的数字化转型&#xff0c;是利用新一代数字技术&#xff08;如工业互联网、人工智能、大数据、云计算、边缘计算等&#xff09;对制造业的整体价值链进行根本性重塑的过程。这不仅涉及技术的应用&#…...

【Windows本地部署n8n工作流自动平台结合内网穿透远程在线访问】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Python中如何加密/解密敏感信息(如用户密码、token)

敏感信息,如用户密码、API密钥、访问令牌(token)、信用卡号以及其他个人身份信息(PII),构成了现代应用程序和系统中最为关键的部分。这些信息一旦被未经授权的第三方获取,可能引发灾难性的后果,从个人隐私泄露到企业经济损失,甚至是大规模的社会安全问题。保护这些敏感…...

Win10如何一键切换IP地址教程

切换IP地址可能对于许多用户来说是一个相对陌生但又可能经常需要进行的操作。无论是出于网络安全、突破网络限制还是仅仅为了测试目的&#xff0c;一键切换IP地址都能带来极大的便利。以下是在 Windows 10 中通过批处理脚本实现一键切换 IP 地址的详细教程&#xff1a; 方法一&…...

2021-11-09 C++三位数平方含有该数

缘由求解&#xff0c;运算函数&#xff0c;哪位大神教一下-编程语言-CSDN问答 void 三位数平方含有该数() {//缘由https://ask.csdn.net/questions/7560152?spm1005.2025.3001.5141int a 100, aa 1000, f 0;while (a < aa){f a*a;while (f > a)if ((f - a) % aa)f …...

高效检测书签网址,告别无效链接烦恼

软件介绍 你是否有过面对浏览器中满满的书签&#xff0c;却不知道哪些网址还“健在”&#xff0c;哪些已经“跑路”的烦恼&#xff1f;别担心&#xff0c;今天就给大家介绍一款神奇的小工具——“网址小卫士”。 检测轻松搞定 还在一个个手动检查书签网址的有效性吗&#xf…...

SpringBoot高校学生评教系统设计实现

概述 基于SpringBoot的高校学生评教系统项目&#xff0c;该系统包含了学生评教、教师管理等功能&#xff0c;适合作为JavaWeb学习项目。 主要内容 1. 学生功能模块 查看评教信息&#xff1a;可以查看学期、院系、任课教师、课程名称等信息评价打分功能&#xff1a;可以对课…...

代码随想录算法训练营第二十天

LeetCode题目: 39. 组合总和40. 组合总和 II131. 分割回文串2176. 统计数组中相等且可以被整除的数对(每日一题) 其他: 今日总结 往期打卡 39. 组合总和 跳转: 39. 组合总和 学习: 代码随想录公开讲解 问题: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 targ…...

C++入门基础:命名空间,缺省参数,函数重载,输入输出

命名空间&#xff1a; C语言是基于C语言的&#xff0c;融入了面向对象编程思想&#xff0c;有了很多有用的库&#xff0c;所以接下来我们将学习C如何优化C语言的不足的。 在C/C语言实践中&#xff0c;在全局作用域中变量&#xff0c;函数&#xff0c;类会有很多&#xff0c;这…...

GPU怎么绑定到服务器上

确认服务器与 GPU 兼容性1&#xff1a;不同的服务器和 GPU 型号连接方式有所不同&#xff0c;要确保所选的 GPU 卡与服务器兼容。可通过服务器和 GPU 的产品文档&#xff0c;或使用服务器厂商提供的兼容性查询工具进行确认。安装前准备&#xff1a;关闭服务器电源&#xff0c;并…...

opencv函数展示2

一、像素操作与算术运算 1.cv2.split() 2. cv2.merge() 3.cv2.add() 4.cv2.bitwise_and() 5.cv2.bitwise_or() 6.cv2.inRange() 二、仿射变换 1.cv2.getRotationMatrix2D() 2.cv2.warpAffine() 3.cv2.flip() 4.cv2.resize() 三、透视变换 1.cv2.getPerspectiveTransform() 2…...

零基础上手Python数据分析 (16):DataFrame 常用统计分析方法

写在前面 —— 超越简单排序,探索数据内在规律,掌握Pandas统计分析基础 上一篇博客,我们学习了如何使用 Pandas 对 DataFrame 进行排序和排名,这使得我们能够更好地组织数据并快速定位关键信息。 然而,仅仅对数据进行排序和排名,还不足以完全理解数据。 要想更深入地解…...

文件系统 软硬连接

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、理解文件系统 &#x1f320;磁盘结构 二、软硬连接 &#x1f31f;软硬链接 &#x1f320;软链接&#xff1a; &#x1f320;硬链接&#xff1a; &#x1f31f;理解软硬链接的应…...

Linux环境基础开发工具使用

本节目标&#xff1a; 1. 学习yum工具&#xff0c;进行软件安装 2. 掌握vim编辑器使用&#xff0c;学会vim的简单配置 3. 掌握gcc/g编译器的使用&#xff0c;并了解其过程&#xff0c;原理 4. 掌握简单gdb使用于调试 5. 掌握简单的Makefile编写&#xff0c;了解其运行思想…...

秘密任务 2.0:如何利用 WebSockets + DTOs 设计实时操作

在之前的文章中&#xff0c;我们探讨了为什么 DTO 是提升 API 效率和安全性的秘密武器。现在&#xff0c;我们进入了一个全新的场景——我们将深入探讨如何通过 WebSockets DTOs 实现实时操作&#xff01; Agent X 正在进行一项高风险的卧底任务。突然&#xff0c;总部更新了…...

LeetCode hot 100—括号生成

题目 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()","()(())",&…...

2025.04.17【Dendrogram】生信数据可视化:Dendrogram图表详解

Dendrogram customization Go further with ggraph: edge style, general layout, node features, adding labels, and more. Customized circular dendrogram Learn how to build a circular dendrogram with proper labels. 文章目录 Dendrogram customizationCustomized c…...

SDL基础

SDL SDL&#xff08;Simple DirectMedia Layer&#xff09;是一个开源的跨平台多媒体开发库&#xff0c;主要用于开发需要图形、音频和输入设备支持的应用程序。它使用C语言编写&#xff0c;提供了简单易用的API&#xff0c;**能够帮助开发者快速实现跨平台的多媒体功能。**SD…...

硬件工程师面试常见问题(2)

第六问&#xff1a;你知道那些常用逻辑电平?TTL与COMS电平可以直接互连吗? 逻辑电平&#xff1a;是数字电路中用于表示二进制逻辑状态&#xff08;0 和 1&#xff09;的电压或电流信号范围&#xff0c;是数字系统中器件间信号传输的统一标准。 注&#xff1a;逻辑电…...

Python自学第2天:条件语句,循环语句

条件语句 1.条件判断 score 60 if score > 90:print("优秀") elif score > 60:print("及格") else:print("不及格") 注意&#xff1a; 1、每个条件后面要使用冒号 :&#xff0c;表示接下来是满足条件后要执行的语句块。2、使用缩进来划…...

2025年4月16日华为笔试第一题100分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 博物馆展览规划 问题描述 卢小姐是一家著名博物馆的策展人,她需要从众多展品中选择一些组成新的展览。每件展品可以展示不同的历史文化主题,而博物馆希望通过最少的展品数量覆…...

智能体开发的范式革命:Cangjie Magic全景解读与实践思考

引言&#xff1a;当智能体开发遇见仓颉魔法 在人工智能技术日新月异的今天&#xff0c;智能体(Agent)开发正从实验室走向产业应用的核心舞台。2025年3月&#xff0c;仓颉社区推出的Cangjie Magic开源平台&#xff0c;以其创新的设计理念和技术架构&#xff0c;为这一领域带来了…...

LeetCode hot 100—单词搜索

题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或…...

基于flask+vue框架的灯饰安装维修系统u49cf(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,工单人员,服务项目,订单记录,服务记录,评价记录 开题报告内容 基于 FlaskVue 框架的灯饰安装维修系统开题报告 一、选题背景与意义 &#xff08;一&#xff09;选题背景 随着城市化进程的加速与居民生活品质的显著提升&#xf…...