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

C++学习之路,从0到精通的征途:List类的模拟实现

目录

一.list的介绍

二.list的接口实现

1.结点

2.list结构

3.迭代器 

(1)begin

(2)end

 4.修改

(1)insert

(2)push_back

(3)push_front

(4)erase

(5)pop_back

(6)pop_front

(7)swap

(8)clear 

5.默认成员函数

(1)构造函数

(2)拷贝构造函数

(3)赋值重载

(4)析构函数

三.代码总览

list.h

test.cpp


 

一.list的介绍

源文档

二.list的接口实现

1.结点

template<class T>
struct list_node
{list_node* _prev;list_node* _next;T _data;// 由于数据类型由模板参数决定,所以缺省值给匿名对象list_node(const T& x = T()):_prev(nullptr),_next(nullptr),_data(x){}
};

        用一个结构体来封装结点,我们手动写默认构造函数以便在申请结点时调用。

2.list结构

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 = 0;
};

3.迭代器 

        list的迭代器与之前的string和vector不同,由于list的数据存储空间并不是连续的,所以我们无法再继续用原生指针来实现迭代器类型,++,解引用等操作并不能实现想要达到的目的,所以我们需要重载这些操作符,并将迭代器封装成一个新的类。

template<class T, class Ref, class Ptr>
struct list_iterator
{typedef list_node<T> Node;typedef list_iterator<T, Ref, Ptr> Self;Node* _node; // 迭代器所指向的结点list_iterator(Node* node):_node(node){}// 比较指向的结点是否相同bool operator!=(const Self& s){return _node != s._node;}bool operator==(const Self& s){return _node == s._node;}// Ref来控制iterator与const_iterator// Ref->T& -- iterator;// Ref->const T& -- const_iterator;// 获取结点存储的数据Ref operator*(){return _node->_data;}// 使迭代器指向下一个结点Self& operator++(){_node = _node->_next;return *this;}// 后置++Self operator++(int){Self tmp(*this);_node = _node->_next;return tmp;}// 使迭代器指向前一个结点Self& operator--(){_node = _node->_prev;return *this;}// 前置--Self operator--(int){Self tmp(*this);_node = _node->_prev;return tmp;}// 为了可读性进行特殊处理 it->->_a1 被优化为 it->_a1// Ptr来控制iterator与const_iterator// Ptr->T* -- iterator// Ptr->const T* -- const_iteratorPtr operator->(){return &_node->_data;}
};

(1)begin

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

(2)end

iterator end()
{// 返回尾结点的下一个结点,也就是哨兵位return iterator(_head);
}
const_iterator begin() const
{return const_iterator(_head->_next);
}

 4.修改

(1)insert

void insert(iterator pos, const T& x)
{// 申请新结点的空间,调用构造Node* newnode = new Node(x);// 断开旧连接,连接新结点Node* cur = pos._node;Node* prev = cur->_prev;// prev newnode curnewnode->_prev = prev;newnode->_next = cur;prev->_next = newnode;cur->_prev = newnode;++_size;
}

(2)push_back

void push_back(const T& x)
{//Node* newnode = new Node(x);//Node* tail = _head->_prev;tail newnode _head//newnode->_prev = tail;//newnode->_next = _head;//tail->_next = newnode;//_head->_prev = newnode;insert(end(), x);
}

(3)push_front

void push_front(const T& x)
{insert(begin(), x);
}

(4)erase

iterator erase(iterator pos)
{Node* cur = pos._node;Node* prev = cur->_prev;Node* next = cur->_next;prev->_next = next;next->_prev = prev;delete cur;--_size;//return iterator(next);// 为防止迭代器失效,返回删除后的下一个结点的迭代器// 单参数构造函数支持隐式转换return next;
}

        为防止erase后,pos依然指向被delete的结点从而导致迭代器失效,erase返回指向下一个结点的迭代器。 

(5)pop_back

void pop_back()
{erase(--end());
}

(6)pop_front

void pop_front()
{erase(begin());
}

(7)swap

void swap(list<T>& lt)
{std::swap(_head, lt._head);std::swap(_size, lt._size);
}

        交换哨兵位即可交换两个list。

(8)clear 

void clear()
{auto it = begin();while (it != end()){it = erase(it);}
}

        除了哨兵位,其他结点逐个erase。 

5.默认成员函数

(1)构造函数

空list申请哨兵位:empty_init

// 空list申请哨兵位
void empty_init()
{_head = new Node;_head->_prev = _head;_head->_next = _head;
}// 无参数构造
list()
{//_head = new Node;//_head->_prev = _head;//_head->_next = _head;empty_init();
}// initializer_list构造
list(std::initializer_list<T> il)
{empty_init();for (auto& e : il){push_back(e);}
}

(2)拷贝构造函数

list(const list<T>& lt)
{empty_init();for (auto& e : lt){push_back(e);}
}

        先申请哨兵位,再逐个尾插即可。

(3)赋值重载

list<T>& operator=(list<T> lt)
{swap(lt);return *this;
}

(4)析构函数

~list()
{clear();delete _head;_head = nullptr;
}

三.代码总览

list.h

#include<iostream>
#include<initializer_list>namespace my_list
{template<class T>struct list_node{list_node* _prev;list_node* _next;T _data;// 由于数据类型由模板参数决定,所以缺省值给匿名对象list_node(const T& x = T()):_prev(nullptr),_next(nullptr),_data(x){}};template<class T, class Ref, class Ptr>struct list_iterator{typedef list_node<T> Node;typedef list_iterator<T, Ref, Ptr> Self;Node* _node; // 迭代器所指向的结点list_iterator(Node* node):_node(node){}// 比较指向的结点是否相同bool operator!=(const Self& s){return _node != s._node;}bool operator==(const Self& s){return _node == s._node;}// Ref来控制iterator与const_iterator// Ref->T& -- iterator;// Ref->const T& -- const_iterator;// 获取结点存储的数据Ref operator*(){return _node->_data;}// 使迭代器指向下一个结点Self& operator++(){_node = _node->_next;return *this;}// 后置++Self operator++(int){Self tmp(*this);_node = _node->_next;return tmp;}// 使迭代器指向前一个结点Self& operator--(){_node = _node->_prev;return *this;}// 前置--Self operator--(int){Self tmp(*this);_node = _node->_prev;return tmp;}// 为了可读性进行特殊处理 it->->_a1 被优化为 it->_a1// Ptr来控制iterator与const_iterator// Ptr->T* -- iterator// Ptr->const T* -- const_iteratorPtr operator->(){return &_node->_data;}};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;// 空list申请哨兵位void empty_init(){_head = new Node;_head->_prev = _head;_head->_next = _head;}// 无参数构造list(){//_head = new Node;//_head->_prev = _head;//_head->_next = _head;empty_init();}// initializer_list构造list(std::initializer_list<T> il){empty_init();for (auto& e : il){push_back(e);}}list(const list<T>& lt){empty_init();for (auto& e : lt){push_back(e);}}// lt2 = lt1list<T>& operator=(list<T> lt){swap(lt);return *this;}~list(){clear();delete _head;_head = nullptr;}void clear(){auto it = begin();while (it != end()){it = erase(it);}}void swap(list<T>& lt){std::swap(_head, lt._head);std::swap(_size, lt._size);}size_t size(){return _size;}iterator begin(){return iterator(_head->_next);}iterator end(){// 返回尾结点的下一个结点,也就是哨兵位return iterator(_head);}const_iterator begin() const{return const_iterator(_head->_next);}const_iterator end() const{return const_iterator(_head);}void push_back(const T& x){//Node* newnode = new Node(x);//Node* tail = _head->_prev;tail newnode _head//newnode->_prev = tail;//newnode->_next = _head;//tail->_next = newnode;//_head->_prev = newnode;insert(end(), x);}void push_front(const T& x){insert(begin(), x);}void pop_back(){erase(--end());}void pop_front(){erase(begin());}void insert(iterator pos, const T& x){// 申请新结点的空间,调用构造Node* newnode = new Node(x);// 断开旧连接,连接新结点Node* cur = pos._node;Node* prev = cur->_prev;// prev newnode curnewnode->_prev = prev;newnode->_next = cur;prev->_next = newnode;cur->_prev = newnode;++_size;}iterator erase(iterator pos){Node* cur = pos._node;Node* prev = cur->_prev;Node* next = cur->_next;prev->_next = next;next->_prev = prev;delete cur;--_size;//return iterator(next);// 为防止迭代器失效,返回删除后的下一个结点的迭代器// 单参数构造函数支持隐式转换return next;}private:// 哨兵位Node* _head;// 有效数据个数size_t _size = 0;};
}

test.cpp

#include"list.h"
using namespace std;namespace my_list
{void test_list1(){list<int> lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(3);lt1.push_back(4);list<int>::iterator it = lt1.begin();while (it != lt1.end()){*it += 10;cout << *it << " ";++it;}cout << endl;lt1.push_back(1);lt1.push_back(2);lt1.push_front(3);lt1.push_front(4);for (auto& e : lt1){cout << e << " ";}cout << endl;lt1.pop_back();lt1.pop_front();for (auto& e : lt1){cout << e << " ";}cout << endl;cout << lt1.size() << endl;}void test_list2(){list<int> lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_front(3);lt1.push_front(4);for (auto& e : lt1){cout << e << " ";}cout << endl;list<int> lt2(lt1);for (auto& e : lt1){cout << e << " ";}cout << endl;list<int> lt3;lt3 = lt1;for (auto& e : lt1){cout << e << " ";}}struct AA{int _a1;int _a2;AA(int a1 = 1, int a2 = 1):_a1(a1), _a2(a2){}};void test_list3(){list<int> lt1 = { 1,2,3,4 };for (auto& e : lt1){cout << e << " ";}cout << endl;list<AA> lt2 = { {1,1},{2,2},{3,3},{4,4} };list<AA>::iterator it = lt2.begin();while (it != lt2.end()){//cout << (*it)._a1 << ":" << (*it)._a2 << endl;//cout << it->->_a1 << ":" << it->->_a2 << endl;cout << it->_a1 << ":" << it->_a2 << endl;++it;}list<AA>::iterator lit = lt2.begin();while (lit != lt2.end()){cout << lit.operator->()->_a1 << ":" << lit.operator->()->_a2 << endl;++lit;}}
}int main()
{my_list::test_list3();return 0;
}

相关文章:

C++学习之路,从0到精通的征途:List类的模拟实现

目录 一.list的介绍 二.list的接口实现 1.结点 2.list结构 3.迭代器 &#xff08;1&#xff09;begin &#xff08;2&#xff09;end 4.修改 &#xff08;1&#xff09;insert &#xff08;2&#xff09;push_back &#xff08;3&#xff09;push_front &#xff0…...

Java大师成长计划之第4天:Java中的泛型

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在现代软件开发中&#xff0c;类型安…...

计算机学报 2024年 区块链论文 录用汇总 附pdf下载

计算机学报 Year&#xff1a;2024 1 Title: 区块链中的公钥密码&#xff1a;设计、分析、密评与展望 Authors: Key words: 区块链&#xff1b;公钥密码算法&#xff1b;算法设计&#xff1b;复杂性分析&#xff1b;密评 Abstract: 比特币的成功&#xff0c;吸引了人们研…...

【Castle-X机器人】三、紫外消杀模块安装与调试

持续更新。。。。。。。。。。。。。。。 【Castle-X机器人】紫外消杀模块安装与调试 三、紫外消杀模块安装与调试2.1 安装2.2 调试2.2.1 紫外消杀模块话题2.2.2 测试 三、紫外消杀模块安装与调试 2.1 安装 使用相应工具将紫外消杀模块固定在Castle-X机器人底盘 2.2 调试 2.2…...

精益数据分析(29/126):深入剖析电子商务商业模式

精益数据分析&#xff08;29/126&#xff09;&#xff1a;深入剖析电子商务商业模式 在创业和数据分析的学习道路上&#xff0c;我们始终在探索如何更精准地把握商业规律&#xff0c;提升业务的竞争力。今天&#xff0c;我们依旧怀揣着共同进步的愿望&#xff0c;深入解读《精…...

AI图像编辑器 Luminar Neo 便携版 Win1.24.0.14794

如果你对图像编辑有兴趣&#xff0c;但又不想花费太多时间学习复杂的软件操作&#xff0c;那么 Luminar Neo 可能就是你要找的完美工具。作为一款基于AI技术的创意图像编辑器&#xff0c;Luminar Neo简化了复杂的编辑流程&#xff0c;即使是没有任何图像处理经验的新手&#xf…...

在Mybatis中为什么要同时指定扫描mapper接口和 mapper.xml 文件,理论单独扫描 xml 文件就可以啊

设计考虑因素 历史兼容性&#xff1a; MyBatis早期版本主要依赖XML配置&#xff0c;后来才引入接口绑定方式同时支持两种方式可以保证向后兼容 明确性&#xff1a; 显式指定两种路径可以使映射关系更加明确减少因命名不一致导致的潜在问题 性能考虑&#xff1a; 同时扫描可…...

MyBatis XML 配置完整示例(含所有核心配置项)

MyBatis XML 配置完整示例&#xff08;含所有核心配置项&#xff09; 1. 完整 mybatis-config.xml 配置文件 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""htt…...

【数据结构入门训练DAY-24】美国大选

文章目录 前言一、题目二、解题思路结语 前言 本次训练内容 训练STL中sort的操作方法。训练解题思维。 一、题目 美国大选是按各州的投票结果来确定最终的结果的&#xff0c;如果得到超过一半的州的支 持就可以当选&#xff0c;而每个州的投票结果又是由该州选民投票产生…...

stm32L4R5ZI Nucleo-144 GPIO点灯及按键中断

文章目录 前言一、CubeMx环境配置二、GPIO点灯操作三、按键中断点灯总结 前言 STM32L4R5ZI Nucleo-144是STMicroelectronics推出的一款基于ARM Cortex-M4内核的微控制器芯片。它是STM32L4系列中的一员&#xff0c;针对低功耗和高性能的应用而设计。以下是一些关键特点和技术规格…...

访问Redis时遇到 unknown command ‘FT.INFO‘, with args beginning with 错误的解决方案

在B站学习 图灵程序员-诸葛 的LangChain入门课程《基于Redis保存历史聊天信息》。在实践代码时遇到了一些问题&#xff0c;在这里记录一下&#xff0c;希望能帮助到也在学习的同学。话不多说&#xff0c;上代码&#xff0c;这段代码使用langchain_redis来持久化大模型对话的聊天…...

Swift与iOS内存管理机制深度剖析

前言 内存管理是每一位 iOS 开发者都绕不开的话题。虽然 Swift 的 ARC&#xff08;自动引用计数&#xff09;极大简化了开发者的工作&#xff0c;但只有深入理解其底层实现&#xff0c;才能写出高效、健壮的代码&#xff0c;避免各种隐蔽的内存问题。本文将从底层原理出发&…...

数据库系统概论(五)关系模型的数据结构及形式化

数据库系统概论&#xff08;五&#xff09;关系模型的数据结构及形式化 前言一、关系&#xff1a;从“表格”说起1.1 关系数据模型中的“关系”是什么&#xff1f;1.2 域&#xff08;Domain&#xff09;&#xff1a;数据的“类型限定”1.3 笛卡尔积&#xff08;Cartesian Produ…...

Python类和对象四(十三)

魔法方法&#xff1a; 按位运算 按位于运算 只要相同才是1 或运算&#xff1a; 只要某个位是1结果就是1 、 按位非 将结果取反 按位异或&#xff1a; 左移和右移运算符&#xff1a; 右移两位 右移动n位&#xff0c;就是除以2的n次方 左移两位&#xff1a; 左移n位就是乘…...

Go 1.24 中的弱指针包 weak 使用介绍

在 Go 语言中&#xff0c;“弱指针”指的是不会阻止垃圾回收器&#xff08;GC&#xff09;回收目标对象的引用。 当一个对象只剩弱指针指向它&#xff0c;而没有任何强引用时&#xff0c;GC 仍会把该对象当作不可达对象并回收&#xff1b;随后&#xff0c;所有指向它的弱指针会…...

毕业项目-基于深度学习的入侵检测系统

选题背景与意义 随着互联网技术的飞速发展&#xff0c;网络在各个领域中的作用日益重要。然而&#xff0c;伴随着技术的进步&#xff0c;网络安全问题也愈加严峻&#xff0c;网络攻击事件频繁发生&#xff0c;给个人、企业乃至国家带来了巨大的经济损失与安全威胁。入侵检测系…...

Github 2025-04-26 Rust开源项目日报Top10

根据Github Trendings的统计,今日(2025-04-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero General Public Li…...

【Hive入门】Hive分桶表深度解析:从哈希分桶到Join优化的完整指南

目录 引言 1 分桶表基础概念 1.1 什么是分桶表 1.2 分桶与分区的区别 2 分桶表设计与创建 2.1 创建分桶表语法 2.2 分桶键选择原则 2.3 桶数确定策略 3 分桶表数据加载 3.1 标准数据加载流程 3.2 分桶表数据验证 4 分桶Join优化原理 4.1 Map端Join优化 4.2 Sort-…...

django之优化分页功能(利用参数共存及封装来实现)

优化分页功能 目录 1.封装分页代码 2.解决分页时覆盖搜索参数的bug 3.优化分页功能 上一篇文章我们讲到了搜索功能和分页展示数据功能。那这篇文章, 在上篇文章的基础上, 会去优化这些功能并解决搜索功能和分页功能不能一起使用的bug。 一、封装分页代码 原本我们的asse…...

linux blueZ 第四篇:BLE GATT 编程与自动化——Python 与 C/C++ 实战

本篇聚焦 BLE(Bluetooth Low Energy)GATT 协议层的编程与自动化实践,涵盖 GATT 基础、DBus API 原理、Python(dbus-next/bleak)示例、C/C++ (BlueZ GATT API)示例,以及自动发现、读写特征、订阅通知、安全配对与脚本化测试。 目录 BLE GATT 基础概念 BlueZ DBus GATT 模…...

前端面试每日三题 - Day 16

这是我为准备前端/全栈开发工程师面试整理的第16天每日三题练习&#xff0c;涵盖事件循环深入解析 、Vue3 响应式系统原理 &#xff0c;以及 多租户系统设计实践。每道题附带 详细解析、示例代码与脑图建议&#xff0c;助你全面掌握底层原理与架构设计思维。 ✅ 题目 1&#xf…...

使用PyTorch实现简单图像识别(基于MNIST手写数字数据集)的完整代码示例,包含数据加载、模型定义、训练和预测全流程

以下是一个使用PyTorch实现简单图像识别&#xff08;基于MNIST手写数字数据集&#xff09;的完整代码示例&#xff0c;包含数据加载、模型定义、训练和预测全流程&#xff1a; import torch import torch.nn as nn import torch.optim as optim import torchvision import torc…...

【Android】四大组件之Activity

目录 一、什么是Activity 二、如何创建和配置Activity 三、Activity 跳转与数据传递 四、数据保存与恢复 五、Activity 启动模式 六、自定义返回行为 七、复杂界面布局 你可以把Activity想象成手机屏幕上的一个“页面”。比如&#xff0c;当你打开一个App时&#xff0c;…...

数据库原理(1)

第一章 概论 一、基本概念 数据&#xff08;Data&#xff09;是数据库中存储的基本对象&#xff0c;描述事物的符号记录。例如学生的学号、姓名等信息都是数据。 数据库&#xff08;Database&#xff0c;DB&#xff09;长期存储在计算机内、有组织的、可共享的大量数据的集合。…...

SQL盲注问题深度解析与防范策略

引言 在当今互联网时代,Web应用程序的安全性是重中之重。SQL注入作为一种常见且极具威胁性的攻击手段,而其中的SQL盲注更是因其隐蔽性强、难以察觉而备受关注。攻击者借助SQL盲注,在无法直接获取数据库返回结果的情况下,通过精心构造特殊的SQL语句,利用页面的不同响应来逐…...

Android JIT( ART即时编译器),Just In Time Compiler,即时编译技术

Android JIT&#xff08; ART即时编译器&#xff09;,Just In Time Compiler&#xff0c;即时编译技术 Android Runtime (ART) 包含一个具备代码分析功能的即时 (JIT) 编译器&#xff0c;该编译器可以在 Android 应用运行时持续提高其性能。JIT是Just In Time Compiler&#xf…...

当自动驾驶遇上“安全驾校”:NVIDIA如何用技术给无人驾驶赋能?

自动驾驶技术的商业化落地&#xff0c;核心在于能否通过严苛的安全验证。国内的汽车企业其实也在做自动驾驶&#xff0c;但是吧&#xff0c;基本都在L2级别。换句话说就是在应急时刻内&#xff0c;还是需要人来辅助驾驶&#xff0c;AI驾驶只是决策层&#xff0c;并不能完全掌握…...

Unity中数据储存

在Unity项目开发中,会有很多数据,有需要保存到本地的数据,也有直接保存在缓存中的临时数据,一般为了方便整个项目框架中各个地方能调用需要的数据,因此都会实现一个数据工具或者叫数据管理类,用来管理项目中所有的数据。 首先保存在缓存中的数据,比如用户信息,我们只需…...

【C++11】可变参数模板

前言&#xff1a; 上文我们学到右值引用及其移动语义&#xff0c;学习到了C11中对性能提升对重要的更新之一。C11进阶之路&#xff1a;右值引用和移动语义&#xff0c;让代码跑得更快&#xff01;-CSDN博客 本文我们来讲讲&#xff0c;C11的下一个新语法&#xff1a;可变参数模…...

c语言知识整理

一 数据的存储 对于整形的存储 无论是正负在存储中都是使用补码进行存储的 那个一个数字的补码在转换正负时不同的 对于存储中 首位一定是符号位 如果是0 那么是正数 如果是1 那么是负数 &#xff08;32位 除符号位 缺少的位数使用0补齐&#xff09; 如果是正数 …...

算法习题-力扣446周赛题解

算法可以调度思维&#xff0c;让程序员的思维发散&#xff0c;找到更好的解决方案。 第一题&#xff1a;执行指令后的得分 题目&#xff1a; 给你两个数组&#xff1a;instructions 和 values&#xff0c;数组的长度均为 n。你需要根据以下规则模拟一个过程&#xff1a; 从下标…...

基于共享上下文和自主协作的 RD Agent 生态系统

在llmangentmcp这个框架中&#xff1a; LLM&#xff1a; 依然是智能体的“大脑”&#xff0c;赋予它们理解、推理、生成和规划的能力&#xff0c;并且也用于处理和利用共享上下文。Agent&#xff1a; 具备特定 R&D 职能的自主单元&#xff0c;它们感知共享上下文&#xff0…...

Operating System 实验五 进程管理编程实验

实验目标: 写个多线程的程序,重现竞争条件,并通过信号量或者互斥量,解决临界区问题某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A、B两种零件,装配车间的任务是把A、B两种零件组装成产品。两个生产车间每生产一个零件后,都要分别把它们送到装配车间的货架F…...

Deep Reinforcement learning for real autonomous mobile robot navigation

​​​​​​​https://www.youtube.com/watch?vKyA2uTIQfxw AI Learns to Park - Deep Reinforcement Learning https://www.youtube.com/watch?vVMp6pq6_QjI Q Learning simply explained | SARSA and Q-Learning Explanation https://www.youtube.com/watch?vMI8ByADM…...

计算机网络 | 应用层(4)--DNS:因特网的目录服务

&#x1f493;个人主页&#xff1a;mooridy-CSDN博客 &#x1f493;文章专栏&#xff1a;《计算机网络&#xff1a;自定向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 &#x1f339;关注我&#xff0c;和我一起学习更多计算机网络的知识 &#x1f51d;&#x1f51d; 目录 …...

WPF核心技术解析与使用示例

WPF核心技术解析与使用示例 一、依赖属性(Dependency Property)详解 1. 依赖属性基础 ​​核心概念​​: 依赖属性是WPF实现数据绑定、样式、动画等特性的基础通过属性系统实现高效的内存管理和值继承​​标准定义模式​​: public class MyControl : Control {// 1. 定义…...

JVM运行机制全景图:从源码到执行的全过程

JVM运行机制全景图:从源码到执行的全过程 引言:你真的了解 Java 是怎么跑起来的吗? 许多开发者写完 Java 代码之后,就交给编译器和运行时去“神奇”地执行了。但你有没有想过,一段 .java 文件是如何一步步变成可运行的程序?今天,我们就从 源码 ➝ 字节码 ➝ 类加载 ➝…...

使用 AFL++ 对 IoT 二进制文件进行模糊测试 - 第二部分

在上一部分中,我们研究了如何使用 AFL++ 对简单的物联网二进制文件进行模糊测试。这些程序接受来自文件的输入,并且易于模糊测试。 在本文中,我们将研究套接字二进制文件。使用套接字进行网络通信的模糊测试二进制文件与使用基于文件 I/O 的模糊测试二进制文件不同。Vanill…...

在华为云平台上使用 MQTT 协议:构建高效可靠的物联网通信

&#x1f310; 在华为云平台上使用 MQTT 协议&#xff1a;构建高效可靠的物联网通信 随着物联网&#xff08;IoT&#xff09;技术的发展&#xff0c;设备间的高效通信变得尤为重要。MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;作为一种轻量级的消息传输…...

基于STM32的物流搬运机器人

功能&#xff1a;智能循迹、定距夹取、颜色切换、自动跟随、自动避障、声音夹取、蓝牙遥控、手柄遥控、颜色识别夹取、循迹避障、循迹定距…… 包含内容&#xff1a;完整源码、使用手册、原理图、视频演示、PPT、论文参考、其余资料 资料只私聊...

H.264/AVC标准主流开源编解码器编译说明

An artisan must first sharpen his tools if he is to do his work well. 工欲善其事,必先利其器. 前言 想研究和学习H.264/AVC视频编解码标准的入门的伙伴们,不论是学术研究还是工程应用都离不开对源码的分析,因此首要工作是对各类编解码器进行编译,本文针对主流的一些符…...

Xilinx FPGA支持的FLASH型号汇总

以博主这些年的FPGA开发使用经验来看&#xff0c;FPGA开发的主流还是以Xilinx FPGA为主&#xff0c;贸易战关税战打了这么多年&#xff0c;我们做研发的也不可避免的要涉及一些国产替代的工作&#xff1b;这里把Xilinx FPGA官方支持的各类&#xff08;国产和非国产&#xff09;…...

【C++ 类和数据抽象】消息处理示例(1):从设计模式到实战应用

目录 一、数据抽象概述 二、消息处理的核心概念 2.1 什么是消息处理&#xff1f; 2.2 消息处理的核心目标 三、基于设计模式的消息处理实现 3.1 观察者模式&#xff08;Observer Pattern&#xff09; 3.2 命令模式&#xff08;Command Pattern&#xff09; 四、实战场景…...

LiveCharts.WPF图表模块封装

WPF LiveCharts.WPF 封装实现 下面是一个完整的 WPF LiveCharts.WPF 封装实现,提供了常用图表的简单使用方式,并支持数据绑定和更新。 一、LiveCharts.WPF 封装类 1. 图表基类 (ChartBase.cs) using LiveCharts; using LiveCharts.Wpf; using System.Collections.Generic;…...

微信小程序,基于uni-app的轮播图制作,轮播图本地文件图片预览

完整代码 <template><swiper class"banner" indicator-dots circular :autoplay"false"><swiper-item v-for "item in picture" :key"item.id"><view><image tap"onPreviewImage(item.img)" :…...

【QQmusic】复习笔记第四章分点讲解

4.1 音乐加载 功能概述 该部分实现了从本地磁盘加载音乐文件到程序中&#xff0c;并在界面上显示的功能。通过QFileDialog类创建文件选择对话框&#xff0c;用户可选择多个音乐文件&#xff0c;程序筛选出有效音频文件后&#xff0c;交由MusicList类管理&#xff0c;并更新到…...

设置右键打开VSCode

在日常的开发工作中&#xff0c;VSCode 是一款非常受欢迎的代码编辑器。为了更加便捷地使用它&#xff0c;我们可以将 VSCode 添加到右键菜单中&#xff0c;这样只需右键点击文件或文件夹&#xff0c;就能快速用 VSCode 打开&#xff0c;极大地提高工作效率。下面我就来介绍一下…...

数据结构和算法(八)--2-3查找树

目录 一、平衡树 1、2-3查找树 1.1、定义 1.2、查找 1.3、插入 1.3.1、向2-结点中插入新键 1.3.2、向一棵只含有一个3-结点的树中插入新键 1.3.3、向一个父结点为2-结点的3-结点中插入新键 1.3.4、向一个父结点为3-结点的3-结点中插入新键 1.3.5、分解根结点 1.4、2…...

JSAPI2.4——正则表达式

一、语法 const str 一二三四五六七八九十 //判断内容 const reg /二/ //判断条件 console.log(reg.test(str)); //检查 二、test与exec方法的区别 test方法&#xff1a;用于判断是否符合规则的字符串&#xff0c;返回值是布尔值 exec方法&…...

FPGA 100G UDP纯逻辑协议栈

随着器件等级的升高&#xff0c;高速serdes的线速率也随之提高&#xff0c;RFSOC 4x最大可支持100G&#xff0c;主流方案为RDMA方案&#xff0c;该方案相对比较复杂&#xff0c;除了需要负责逻辑端的开发&#xff0c;还需操作系统中开发RDMA的驱动&#xff0c;对于对丢包不那么…...