自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 数据传输中的守护者:深度解析CRC的错误检测能力

本篇内容为上课受老师启发,在课后加以思考的产物。如果错误,欢迎指出!本内容不讨论任何关于CRC如何计算以及验证的问题,。对于仅仅需要备考的朋友们就可以选择忽视该文章了。

2025-03-03 15:25:25 947 1

原创 【快速上手】用 Anaconda 搭建专属 Python 虚拟环境

Anaconda 是一个开源的 Python 和 R 语言的发行版本,其核心功能是帮助用户轻松创建、管理和切换不同的虚拟环境。在这些虚拟环境中,用户可以安装特定版本的 Python 以及各种所需的库和依赖项,从而实现不同项目之间的环境隔离,避免因依赖冲突等问题导致的项目运行错误。例如,一个项目需要,另一个项目需要,通过 Anaconda 创建的虚拟环境就可以轻松满足这些不同的需求,让每个项目都能在各自独立的环境中稳定运行。Anaconda是一款可以方便搭建。

2025-02-25 10:32:29 865

原创 函数栈帧的创建与销毁

指针也是变量,所以和变量的方法一样:压栈、压栈、压栈!不过由于其是指针,所以形参声明的类型也是指针,这样在被调用的函数中就拥有访问变量地址以实现永久修改变量值的能力了。这就是为什么在函数内部修改值,函数外部不会有任何效果,因为传递的是值的副本。接下来的步骤涉及其他操作,这些操作与栈帧的创建关系不大,属于函数执行过程中的其他额外步骤。的值+=操作数的占用空间(类型所占空间)(如:操作数是word类型,便取出esp所指向的两个字节赋给操作数)需要注意的是,栈是从高地址向低地址生长的,因此栈顶的地址小于栈底。

2024-11-16 23:56:56 797 1

原创 Oracle XE命令行创建数据库的一波三折(已解决)

这篇文章是我在误装了oracle xe(精简版数据库)后有感而写,对于xe的具体区别将在文末进行说明。ps:本文的操作方法并未在oracle11标准版数据库上尝试过(因为某盘下载实在是太慢啦!!!),仅仅针对XE版本数据库实验课上,老师要求我们下载oracle database,于是我“壮志满怀”的去下载了可是,一找一个不吱声!!官网全是23AI版本,下载后安装还有一堆问题,一顿找没找到官网的11g(如果找别人博客的链接,又几乎全是某网盘,慢慢慢!!烦死啦!!幸运的是,好兄弟找到并将网址发给我辣!!

2024-11-11 11:14:38 1255

原创 关于《Effective C++》条款27中派生类转型调用基类的理解

但是,作者评价道:它看起来对,但实际上错!–摘自原文。

2024-11-03 20:39:27 335

原创 [Linux网络编程]深入了解TCP通信API,看看底层做了啥(看了这篇文章,你也算是读了Linux源码的高手!)

在学了Linux网络编程时,有几个问题一直困扰着我listen的第二个参数backlog到底是什么为什么网络套接字也是文件描述符为什么要bind(),他起了什么作用于是就决心梳理一下整套通信的过程,建立完整的通信框架,便有了这篇文章tips:以下内容均在Linux2.6内核讨论,不同内核的实现方式大致相同,但是某些细节略有不同!!

2024-10-14 00:06:00 1045

原创 [Linux]进程间传递文件描述符(一看就懂)

该模型采用多线程方式(进程也一样,后续我就当作进程来讨论),父进程只负责监听新链接的到来,通过IPC的方式通知其余进程,让其余进程竞争锁(我写的版本并没有加锁,目前看来好像也没啥问题)。对于多进程的文件描述符的传递,因为进程具有独立性,且是资源划分的最小单位,所以不同进程间文件描述符表不同就是意料之内的了。对于多线程的文件描述符的传递,往往是十分简单的,因为他们根本不需要传递(共享同一个文件描述符,谁还需要传!控制信息的长度(对于文件描述符就是int,下文讨论对应的CMSG_LEN宏,用来初始化该字段)

2024-09-29 23:50:42 1419

原创 unshare -p时提示Cannot allocate memory如何解决

如果想要正常使用,只需要添加–fork选项就行在使用unshare -p创建新的 PID 命名空间时,存在一些关键的特性和限制。

2024-09-24 16:51:51 442

原创 IO复用-epoll基础

当某个文件描述符已经准备好了,调用recv读取数据的时候,发现这个文件描述符内的内容并不完全,此时如果再去调用别的文件描述符,那么原先缓冲区的内容就会被覆盖,原先读到的内容也没了。LT:当文件描述符准备好后,只要该文件描述符没有进行处理,那么epoll_wait()就会一直响应该文件描述符,告诉用户你要进行处理了,直到你读取了文件描述符内的数据。其原理是通过同时管理多个IO接口(文件描述符),将等待的时间重叠,这样使得在相等的时间内,出现满足条件的文件描述符的概率增大。

2024-09-11 20:54:10 1048

原创 复制会话与复制SSH渠道的区别

复制会话的本质:通过将当前用户登录信息传递给SSH服务端验证来再创建用户(所以在复制的时候,会感觉到明显的延迟),然后为这个新用户创建终端文件+bash进程。在同一个以建立的用户下(PID=185000),创建了多个终端文件+多个bash进程(守护进程),每个终端文件对应一个bash进程。守护进程的作用是当终端退出时,处于当前终端的进程不会被杀掉。这个文件是终端文件,所有的输入输出均与他有关,向这个文件输入,就是向对应终端输入。复制SSH渠道的本质:在本地已建立的用户下,新建终端文件+bash进程。

2024-08-27 15:23:56 646

原创 [Linux]一篇文章带你全面理解信号

在操作系统(OS)中,信号(signal)是一种进程间通信(IPC)的机制,特别是在Unix、类Unix以及其他POSIX兼容的操作系统中。信号是一种异步的通知机制,用来提醒进程一个事件已经发生。信号是系统提供的一种让用户(进程)能够给其他进程发送异步信息(可以理解任意时间都可以发送,接受信号的进程无法预料到信号到来的时间)的方式信号的发送,是为了让接受信号的进程做一些自己执行流之外的操作(如:你正在打游戏,家里人喊你吃饭,这就是给你的一个信号)

2024-05-15 12:22:22 898

原创 [C++]哈希应用-海量数据处理

(主要)内存的IO速度远超硬盘的IO速度,所以单次硬盘IO于多次硬盘IO的速度差别是十分大的在硬盘中,各种数据结构的实现较为麻烦(如map、priority_queue…)

2024-05-09 23:41:50 933

原创 [C++]哈希应用-布隆过滤器快速入门

布隆过滤器(Bloom Filter)是一个由布隆在1970年提出的概率型数据结构,它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器的主要特点是高效的插入和查询,可以用于检索一个元素是否在一个集合中。对于一个数据的查找,会先去布隆过滤器中进行多个映射点的查询。

2024-05-08 20:49:16 591 1

原创 [Linux]一篇文章带你搞定软硬连接

它的应用场景非常广泛,比如当需要在不同的目录中使用相同的文件时,只需要在某个固定目录放上该文件,然后在其他目录下使用软链接链接该文件,这样既节省了磁盘空间,又方便了文件的访问。如果你这个时候去删掉他们之间的任意一个后,再去打开另外一个,发现内容还是没有变(就好像删除的操作白做了一样),这是由于硬链接的特性,会在后面进行叙述(不同的是,如果你删除了被软链接链接文件,则你会发现软链接就没有用了,打不开对应的源文件)硬链接并不会拷贝文件,因为开销太大,相反它利用了引用计数的思想,来实现链接,听我娓娓道来。

2024-04-14 15:26:26 726 1

原创 [C++]从0-1实现红黑树封装map&set

是一种树形数据结构,其是由改良而得的。AVL树的缺陷:对于AVL树,他的发明人真的十分厉害,它通过调整平衡因子使树达到平衡,从而使高度达到最低,大大加快了遍历速度。但是有一种开销却在不知不觉中产生:调整平衡因子过程中的旋转开销。而红黑树通过减少旋转次数来使这种构造开销降低,但是从理论上来讲,红黑树的遍历肯定没有AVL树快,但是他的构造相比AVL树就少了数次的旋转,开销大大降低。由于其根本上还是一个平衡二叉树的属性,所以他的旋转操作与AVL树大差不差,整体思路也大致相同,唯一不同的就是其旋转的条件。

2024-04-13 23:07:38 698

原创 [C++11]右值引用

这就和历史有关,由于C++的代码存量大,许多的代码在当初书写时并没有右值引用的提出,所以C++11为了向前兼容,就会根据情况判断是否隐式调用move。总结:两者的底层都是指针,唯一不同的就是他们所指的位置。当然,我们所写的右值引用版本的拷贝构造当然用的是方法2,而return时move(v)就是为了让这个v的右值版本去return(move不修改v的原本属性)按照我们前面所说,v返回的时候先调用移动拷贝,然后再调用构造来构造ret,但是编译器为了更高的效率,还会在此基础上进一步优化。

2024-03-31 15:56:52 1003 1

原创 [C++11]可变参数模板

让我们先见一下可变参数模板//...一个可变参数模板(variadic template)就是一个接受可变数目参数的模板函数或模板类。可变数目的参数称为参数包(parameter packet)。模板参数包(template parameter packet),表示零个或多个模板参数;函数参数包(function parameter packet),表示零个或多个函数参数。让我们带着以下几个问题去学习可变参数模板可变参数模板如何实例化如何书写可变参数模板可变参数模板的运用—emplace系列。

2024-03-31 15:56:39 900

原创 数据结构课设C++_迷宫游戏

该课设内容于初学C++时所做,代码指令仍有很大提升余地!4大建迷宫算法DFS、(Random)Prim、十字分割法、(Random)Kruskal1种寻路算法A*寻路easyx画迷宫(作者现学现做的,如有不足还多包含)

2024-03-13 20:22:31 1449

原创 [C++读书笔记]常量表达式&constexpr

被constexpr修饰的变量本身是不能修改的,但是它指向/引用的非const/非constexpr对象则可以被修改所以如果你不想指向/引用的对象可以被修改,要么给该对象加上const,要么给该对象加上constexpr。

2024-03-13 20:21:43 941

原创 [Linux]如何理解kernel、shell、bash

kernel是指操作系统中的核心部分,用户一般是不能直接使用kernel的。从上图中的grep指令(最后一行)中可以看出,每一次进行查找指令时,都会创建一个进程来执行查找操作,而这个进程的父进程就是bash。是为了预防用户的一些风险操作。其作用是将用户的指令翻译给kernel进行处理,以及将kernel的处理结果翻译返还给用户。每当启动一个命令行时(复制了会话窗口),都会创建一个bash进程(下图可以看出,对于每一个bash进程,他们的父进程的pid相等,说明bash是同一个进程创建的子进程)

2024-03-02 20:34:19 888

原创 [C++]AVL树怎么转

一提到AVL树,脑子里不是旋了,就是悬了。AVL树之所以难,并不是因为结构难以理解,而是因为他的旋转。bf[-1,1]AVL树是二叉搜索树的衍生,其名字来源是根据两位俄罗斯的数学家和E.M.Landis,他们在1962年发明的一种用来解决二叉搜索树在极端情况下时间复杂度变为O(n)的情况。而其解决该情况的方法便是:通过旋转旋转来调整二叉搜索树的平衡。

2024-03-02 20:33:45 1058

原创 [C++]STL的map如何重载[]

解引用后,调用其第二个元素(key-value中的value),对其++,这样就可以使得该元素的计数+1(即map中value值+1)。如果该元素是第一次插入,则这个解引用的值是0(当类型是内置类型时),对其++,也变成了1。是一个迭代器,指向的内容有两种可能:1、如果map中在插入前没有该元素,则指向我将要插入的pair(即刚刚创建的pair)2、如果map中在插入前已经有了该元素,则指向map中的这个元素(这个元素也是一个pair)调用的是步骤2返回的pair的第一个元素,是一个。

2024-02-29 17:23:44 1120

原创 [Linux]文件基础-如何管理文件

fopenfwritefreadfclosefseek那么深入到操作系统层面,看看OS是如何接收C语言的指令并完成这一些列函数操作的!

2024-02-24 18:31:30 879

原创 二叉搜索树删除操作的递归与非递归写法

对于二叉搜索树的删除操作,主要分为以下3种情况讨论:1、删除的结点没有左右孩子2、删除的结点只有一个孩子3、删除的结点有左右孩子。

2024-02-12 21:44:51 580

原创 [C++]单/多继承体系中的虚函数表

对于单继承体系中的基类派生类中的虚表关系如下:基类有虚函数,所以基类有一个自己的虚表指针,指向自己的虚表,虚表中存放的就是func1()的地址。派生类继承了基类的虚函数,所以有一个自己的虚表指针,指向自己的虚表,因为派生类重写了基类的虚函数,所以虚表中func1()函数的地址与基类不同。同时派生类又增加了一个虚函数,所以他的虚表里面有两个函数地址。

2024-02-04 21:17:43 996

原创 [c++]多态的原理

OOP的核心思想是多态性。多态性这个词源自希腊语,其含义是“多种形式”。我们把具有继承关系的多个类型称为多态类型,因为我们能使用这些类型的“多种形式”而无须在意它们的差异。引用或指针的静态类型与动态类型不同这一事实正是C++语言支持多态性的根本所在。在C++语言中,当我们使用基类的引用或指针调用一个虚成员函数时会执行动态绑定。上述内容表明,C++中多态的原理与动态绑定联系十分密切。

2024-02-04 15:29:11 909

原创 手搓反向迭代器

对于这一对运算符,他们要做的正好和符号相反,++要实现的实际上是正向迭代器的- -,所以实现起来也很简单,反向迭代器的++调用正向迭代器的- -,反向迭代器的–调用正向迭代器的++

2024-01-26 15:39:13 915

原创 迭代器失效

迭代器(iterator)是一种用来访问容器的工具(其底层就是一个指针、或者是一个被封装的指针),对于每种容器,STL都会提供对应的迭代器,而我们对这些容器内容的访问,就转变成对迭代器的遍历,进而实现对于不同容器内元素的访问方式统一。

2024-01-20 11:31:37 441

原创 僵尸与孤儿(Linux下各进程状态的查看)

僵尸与孤儿(Linux进程的状态)

2023-12-10 11:01:25 1262

原创 C++多文件编译时报错解决方案(.h.cpp.cpp)

该情况是因为缺省参数同时用在了定义和声明的参数里面(C++不允许声明和定义同时给缺省参数)在定义里面去掉缺省参数(一般不会在声明的时候去除缺省)​报错如图,这种错误第一次见到都会无从下手其实错误很简单,就是包含头文件的时候,如果头文件里面有全局、静态变量/函数,那么就会导致这个变量/函数会被每个.cpp文件包含一次。这就导致在链接的时候,会发生重定义现象(上图也表明了是在链接的时候出的错)将该变量/函数放入**.cpp**文件中。

2023-12-02 15:19:04 1853

原创 make/Makefile

平时在Linux下写C/C++代码代码是,是否总会遇到一个问题:对于我们写好的一个code.ccode.cpp文件,我们想要运行的时候,必须要通过、**g++**来编译这就导致每次都需要输入以下代码,才能生成对应的可执行文件:对于小工程这样写自然没有问题,但是如果这个工程的文件有呢?那岂不是每次修改了任意一个文件的内容都要重新写一遍​从而对于以上的代码:只需要一个make指令就可以完成编译,又只需要一个make clean指令就可以完成清理。

2023-11-27 21:56:15 1055

原创 C++默认成员函数(构造,拷贝构造,析构...)详解

完成初始化任务上图分为重点重点从函数的中可以看出内置类型:int/double/char/指针…(原生定义类型)Tips:在C++11后,编译器支持在函数声明处给缺省值来初始化,这点会在后面的初始化列表提到。

2023-11-10 21:50:44 131 1

原创 C++传引用

是定义一个新的变量,使得其地址处存的值等于a。是对a的一个引用,此时c的地址就是a的地址。对c做改变,就是对a地址处的值做改变。对b做改变,改变的是b地址处存的值。指针可以不初始化,让他指向随机值。指针可以不初始化,让他指向随机值。1、引用必须初始化,应该写做。1、引用必须初始化,应该写做。

2023-10-31 14:47:10 75 1

原创 Linux文件属性

后文围绕着上图解释Linux中的文件属性: 在我们常见的windows下面,我们区分文件是通过他的后缀 而在Linux里面,文件类型的区分不通过后缀,而是通过“前缀” Linux中把访问者分为3类:拥有者,所属组,other 文件权限主要分为3类:r(可读),w(可写),x(可执行)

2023-10-28 11:35:40 72 1

原创 传参时:传值、传址、传引用的汇编指令

1、传值传参:把实参的数据拷贝一份,放进寄存器,然后赋值给对应的形参把x,y的值,分别放入一个寄存器里面(后面用call调用函数)然后调用函数创建栈帧的前两步就把寄存器edx,ecx的值放进对应的a,b的位置了(这里0x000000DAF16FF510和0x000000DAF16FF518就是后面a,b的地址)进行加法操作int c = a + b:分别将a、b的值放入ecx、e

2023-10-28 11:05:22 445 1

原创 C++ 改进 C 内容之——inline(内联函数)

可以把内联函数就理解成一个宏,碰到add就替换掉他因为内联函数是直接替换函数的调用、链接的时候不可能生成地址,所以如果定义在第3个文件中,那么这个函数是没有地址的,链接的目的就是找函数地址,这样就发生了:只有add函数的声明,而没有定义,所以就会报错。

2023-10-19 12:42:27 513 1

原创 八大排序时间复杂度与稳定性

因为每一趟排好一个数据后,会把这个数组一分为二,而被分成的这两个数组总元素少1(可忽略,因为到最后这个总元素不会相差原始元素个数太多,若差10则说明有1024个数据)。用二分法,类比二叉树。n个数据,总共分成了 log n 层,每次都要对上一层的数据全部处理完,才能形成了新的下一层的新数据,再来进行下次的处理。每一趟的这一个待插入数据,都要向前挨个找,找到满足的为止,最多走 n-i-1 次,最少直接插入。每一趟能排好一个数据,一共n个数据,如果前n-1个都排好了,那么最后一个就不用排了。

2023-10-06 23:20:48 10945 1

原创 一篇文章解决二叉树递归问题

由于每棵树的左右孩子节点都可以构成一棵新树,所以我们就递归左右孩子节点(root->left 、root->right)直到左右孩子都满足返回条件时递归停止。可以形象的比作把任务交给孩子去做,然后孩子又交给他的孩子去做,直到最后的孩子没有孩子了,就自己做了(递归开始返回)你会成功free掉他的左孩子,但是当你想找右孩子时,会发现节点已经被free掉了,找不到右孩子。很简单:遍历一遍,把每个节点都遍历到,每次遍历到的节点,我们都把他删掉,就实现了。每个节点都可以当作一个根节点,并和他的孩子节点构成一棵树。

2023-10-05 12:17:58 120

原创 八大排序之一:堆排序(详解)

实际上:{ 1,7,9,2,0,5,10 } 我们认为:{ 1,7,9,2,0,5 }再多次对剩下的数据继续进行建堆,就可以选出第2大/小的,第3大/小的......可惜这样的排序,不会修改原数组,如果需要修改原数组,则还需要进行一遍覆盖。以上就是堆排序的全部内容,如果您有什么问题或者建议,随时欢迎与作者讨论!并不是有序的,这是因为我们还没有进行排序,只是进行了建堆。:继续对剩下的元素 {9,7,5,2,0,1} 进行。建好后的堆是 { 9,7,5,2,0,1 };

2023-09-20 11:05:44 3629 2

原创 树的应用之——前缀码

但是前缀码的规则,因人而异,因专业而异,不同的受众人群会有不同的使用习惯,这就导致了可能。我们可以得出如下几点。以上就是前缀码的知识,希望对您有所帮助,如有遗漏或不足,欢迎和作者讨论!当我们想输入“I am a freshman”时,我们需要用。而我们常见的编码都是有默认规则的(以下是举例,以实际为准)可以从任何二叉树来构造一个前缀码,其中每个内点的。当我们想输入更多数据时,我们需用更多位来保存。(这里我们暂且忽略空格)来保存该数据。当我们想输入“eat”时,我需要用。对于甲来说:010110表示eat。

2023-09-16 15:35:15 1785 4

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除