- 博客(137)
- 收藏
- 关注
原创 【数据结构】二叉搜索树(二叉排序树)、平衡二叉树、红黑树、B树、B+树详解
摘要:本文主要是对常用的树结构进行详解,其中包括二叉搜索树(二叉排序树)、平衡二叉树、红黑树、B树、B+树。
2024-08-20 20:56:18
427
原创 【C++】多线程编程一(初识并发和多线程)
进程间的通信比较简单,但是速度慢,因为操作系统会在进程间提供一定的保护措施,以避免一个进程去修改另一个进程的数据(这些保护操作意味着可以编写更安全的并发代码)。第一种途径是每个进程只要一个线程,这就类似让每个开发人员拥有自己的办公室,而第二种途径是每个进程有多个线程,如同一个办公室里有两个开发人员。:指同一时刻只能有一条指令执行,但是多个进程指令被快速地轮换执行,使得在宏观上具有多个进程同时执行的效果,但实际在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
2023-07-16 16:11:54
491
原创 【C++】设计模式-单例模式
单例模式单例模式(Singleton Pattern)是 一种属于创建型设计模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
2023-07-16 15:07:47
1791
原创 【数据结构】插入排序(二)——希尔排序
希尔排序按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为递减增量排序算法。但希尔排序是非稳定排序算法。
2023-05-12 12:39:25
294
原创 【Linux系统】yum源安装技巧
一、yum工具被删除或无效使用1、安装yum① 查看Linux操作系统版本uname -a②卸载现有yum源rpm -qa yum //查看yum组件rpm -qa | grep yum | xargs rpm -e --nodeps/*注意:这一步一定要执行,而且要将所有的组件卸载掉,如果卸载不干净,后面安装会有问题*/rpm -qa yum //查看是否删除干净③下载yum的rpm包(可以是阿里云、腾讯等其他公司的)阿里云开源镜像站资源目录主要下载包有以下三个:
2022-03-22 15:49:39
2419
原创 【C++】PIMPL模式
一、PIMPL模式引入PIMPL是指pointer to implementation,又称作“编译防火墙”。它通过将类B放置在单独的类A中,使用B的不透明指针进行访问实现,从而隐藏了A类的实现细节。是实现“将文件间的编译依存关系降至最低”的方法之一。实例:常规实现book类book.h#pragma once#include <iostream>class book{public: book(std::string name,double price); ~
2022-01-05 18:22:19
5701
1
原创 【存储知识】NAS存储
NAS基础概念NAS(Network Attached Storage)网络附加存储,即将存储设备连接到现有的网络上,提供数据和文件服务,支持网络文件共享协议CIFS、NFS,NAS实际上就是一个专门优化了的文件服务器。NAS服务器一般由存储硬件(逻辑的、冗余的存储容器或RAID阵列)、操作系统以及其上的文件系统等几个部分组成。它基于TCP/IP协议实现文件级数据的存取服务。 NAS将存储设备通过标准的网络拓扑结构连接,可以无需服务器直接上网,不依赖通用的操作系统,而是采用一个面向用户设计的、专门用
2021-11-29 12:20:19
12962
原创 【存储知识】快照
一、存储快照概念全球网络存储工业协会SNIA(StorageNetworking Industry Association)对快照(Snapshot)的定义是:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像。快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。快照的作用主要是能够进行在线数据备份与恢复。① 当存储设备发生应用故障或者文件损坏时可以进行快速的数据恢复,将数据恢复某个可用的时间点的状态。② 为存储用户提供了另外一个数据访问
2021-11-15 17:19:08
3204
2
原创 【存储知识】存储基础知识(存储设备、HBA卡、硬盘接口类型、存储特性指标)
本文介绍了物理存储设备SDD和HDD及相关组件,并对硬盘接口进行梳理。同时也会给大家分析了存储特性指标和存储组网方式。
2021-11-11 13:40:26
10569
原创 【存储知识】RAID(磁盘冗余阵列)与 LVM(逻辑卷管理器)
一、RAID磁盘冗余阵列硬盘设备是计算机中较容易出现故障的元器件之一,加之由于其需要存储数据的特殊性质,不能像CPU、内存、电源甚至主板那样在出现故障后更换新的就好,所以在生产环境中一定要未雨绸缪,提前做好数据的冗余及异地备份等工作。1988年,美国加利福尼亚大学伯克利分校首次提出并定义了RAID技术的概念。RAID技术通过把多个硬盘设备组合成一个容量更大、安全性更好的磁盘阵列,并把数据切割成多个区段后分别存放在各个不同的物理硬盘设备上,然后利用分散读写技术来提升磁盘阵列整体的性能,同时把多个重要数
2021-11-09 16:50:11
5343
2
原创 【存储知识】文件系统与硬盘存储(分区、格式化、挂载、inode、软链接与硬链接)
一、Linux系统的文件存储结构在Linux系统中,目录、字符设备、套接字、硬盘、光驱、打印机等都被抽象成文件形式(“Linux系统一切皆文件”)。既然平时我们打交道的都是文件,那么又应该如何找到它们呢?在Windows操作系统中,想要找到一个文件,要依次进入该文件所在的磁盘分区(也叫盘符),然后再进入该分区下的具体目录,最终找到这个文件。但是在Linux系统中并不存在C、D、E、F等盘符,Linux系统中的一切文件都是从“根”目录(/)开始的,并按照文件系统层次标准(FHS)采用倒树状结构来存
2021-10-29 15:30:24
4554
4
原创 【C++】类默认函数的控制:=default 和 =delete
一、默认函数和已删除函数的引入C++的类中有四种特殊成员函数:默认构造函数、析构函数、拷贝构造函数及拷贝赋值运算符。C++11 引入了移动语义,并将移动构造函数和移动赋值运算符添加到编译器可自动生成的特殊成员函数的列表中。这对于简单类型非常方便,但是复杂类型通常自己定义一个或多个特殊成员函数,这可以阻止自动生成其他特殊成员函数。 具体规则: 如果显式声明了任何构造函数,则不会自动生成默认构造函数。 如果显式声明了虚拟析构函数,则不会自动生成默认析构函数。 如果显式声明
2021-10-22 13:26:31
1196
原创 【C++】Lamda表达式、仿函数(函数对象)
Lambda表达式的引入有的函数对象类只用来定义一个对象,而且这个对象只使用了一次,这样的函数对象类有点浪费。而且,定义函数对象类的地方和使用函数对象类可能相隔较远,想要查看其operator()成员函数到底做了什么会比较麻烦。对于只使用一次的函数对象类,能否直接在使用它的地方定义呢?Lambda表达式就能解决这个问题,使用Lambda表达式可以定义并创建匿名的函数对象,减少程序中函数对象类的数量,以简化编程工作。Lambda的语法格式如下:【捕获列表】捕获上下文的变量以供Lamb.
2021-10-21 18:35:59
768
原创 【C++】引用
一、引用的概念参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上。对于像 char、bool、int、float 等基本类型的数据,它们占用的内存往往只有几个字节,对它们进行内存拷贝非常快速。而数组、结构体、对象是一系列数据的集合,数据的数量没有限制,可能很少,也可能成千上万,对它们进行频繁的内存拷贝可能会消耗很多时间,拖慢程序的执行效率。C/C++禁止在函数调用时直接传递数组的内容,而是强制传递数组指针。而对于结构体和对象没有这种限制,
2021-10-20 17:02:40
265
原创 【C++】动态对象创建
在C语言中提供了内存分配函数malloc()(或calloc()/realloc())和free(),这些函数在运行时从堆内存中分配存储单元。然而,在C++中这些函数将不能很好地运行。因为构造函数不允许我们向它传递内存地址来进行初始化。C++是如何保证正确的初始化和清理,又允许我们在堆上动态创建对象呢?malloc()和free()都是库函数,因此不在编译器控制范围为内。然而,如果有一个完成动态内存分配及初始化组合动作的运算符和另一个完成清理及释放内存组合动作的运算符,编译器就可以保证所有对象的
2021-10-20 11:35:22
6008
原创 【C++】虚函数及其内存布局
一、函数调用捆绑把函数体与函数调用相联系称为捆绑。当捆绑在程序运行之前(由编译器和连接器)完成时,称为早捆绑。C编译只有一种函数调用方式,就是早捆绑。早捆绑引起的问题:因为编译器在只有对象的地址时它并不知道要调用的正确函数。根据对象的类型,捆绑发生在运行时,这种捆绑方式称为晚捆绑,又称动态捆绑。二、虚函数对于特定的函数,为了引起晚捆绑,C++要求在基类中声明这个函数时使用virtual关键字,这样的函数称为虚函数。晚捆绑只对virtual函数起作用,而且只在使用含有virtual函.
2021-10-18 17:06:10
2191
原创 【C++】内联函数inline
引入内联函数的原因一个 C++程序的执行过程可以认为是多个函数之间的相互调用过程,它们形成了一个调用链条,这个链条的起点是 main(),终点也是 main()。当 main() 调用完了所有的函数,它会返回一个值(例如return 0;)来结束自己的生命,从而结束整个程序。函数调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理现场,将之前压入栈中的数据都出栈,才能接着执行
2021-10-13 17:39:40
656
原创 【C++】移动构造函数
在 C++ 11 标准之前,如果想用其它对象初始化一个同类的新对象,只能借助类中的拷贝构造函数。拷贝构造函数的实现原理是为新对象复制一份和其它对象一模一样的数据。而当类中拥有指针类型的成员变量时,拷贝构造函数中需要以深拷贝的方式复制该指针成员。#include <iostream>using namespace std;class demo{public: demo():num(new int(0)){ cout<<"construct!"<
2021-10-13 16:47:49
7955
7
原创 【数据库】数据库安全性
目录前言:一、数据库安全概述1.数据库的不安全因素2.安全标准TCSEC/TDI安全级别划分:二、数据库安全性控制1.用户身份鉴定2.存取控制3.自主存取控制(1)GRANT(向用户授予对数据的操作权限)(2)REVOKE(回收用户对数据的操作权限)(3)数据库角色4.强制存取控制5.视图机制6.审计7.数据加密(1)存储加密(2)传输加密8.其他安全保护(1)推理控制(2)隐蔽通道(3)数据隐私前言:数据库的安
2021-04-21 23:26:19
5286
原创 【网络编程】服务器模型和I/O模型
目录一、服务器模型1、C/S(客户端/服务器)模型2、P2P(点对点)模型二、服务器基本框架①I/O处理单元②逻辑单元③网络存储单元④请求队列三、I/O模型①阻塞I/O②I/O复用③SIGIO信号④异步I/O一、服务器模型1、C/S(客户端/服务器)模型(1)C/S模型:所有客户端都通过访问服务器来获取所需的资源。具体如下图1所示:图1 C/S模型(2) C/S模型的TCP服务器和TCP客户端的工作流程。如图2所示:图2C...
2021-04-13 23:10:58
482
原创 【C++】智能指针
内存管理是C++中的一个常见的错误和bug来源。在大部分情形中,这些bug来自动态分配内存和指针的使用:当多次释放动态分配的内存时,可能会导致内存损坏或者致命的运行时错误;当忘记释放动态分配的内存时,会导致内存泄露。所以,我们需要智能指针来帮助我们管理动态分配的内存。
2021-04-08 15:51:41
479
原创 【网络编程】socket编程
目录前言一、socket介绍二、socket通信过程三、socket接口函数(1)创建socket——socket()(2)命名socket——bind()(3)监听socket——listen()函数(4)接受连接——accept函数(5)发起连接——connect()函数(6)关闭连接——close()函数(7)数据读写——read()、write()函数四、实例演示前言网间进程通信要解决的是不同主机进程间的相互通信问题。首先要解决的是网间进程标识
2021-04-06 22:31:02
639
原创 【C++】STL 序列式容器源码剖析
一、vectorvector 基本能够支持任何类型的对象,同时它也是一个可以动态增长(二倍)的数组,使用起来非常的方便。【问题】它是如何做到动态扩容的呢?1、vector 基本数据结构基本上,STL 里面所有的容器的源码都包含至少三个部分: 迭代器,遍历容器的元素,控制容器空间的边界和元素的移动; 构造函数,满足容器的多种初始化; 属性的获取,比如 begin(),end()等; vector 也不例外,其实看了源码之后就发现,vector 相反是所有容器.
2021-04-05 15:48:06
1093
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人