自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(66)
  • 资源 (1)
  • 收藏
  • 关注

原创 关于头文件的一切

头文件的害处反观现代的编译语言,他们比C++的历史包袱轻得多,模块化做的也比较好。模块化的做法主要有两种:这两种做法都避免了声明预定义不一致的问题,因为在这些语言里声明和定义是一体的。同时这种import手法也不会引入不想要的名字,简化了名字查找的负担,也不用担心import的顺序不同造成代码功能的变化头文件的使用规则...

2022-06-18 22:13:19 771 1

原创 c++ try catch throw

异常是程序在执行期间产生的问题。异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw。例子一例子二:

2022-06-09 15:09:04 357

原创 I/O多路复用

I/O 多路复用使得程序能同时监听多个文件描述符,能够提高程序的性能Linux 下实现 I/O 多路复用的系统调用主要有:API参数:返回值 :例子poll参数:fds : 是一个struct pollfd 结构体数组,这是一个需要检测的文件描述符的集合nfds : 这个是第一个参数数组中最后一个有效元素的下标 + 1timeout : 阻塞时长返回值:例子epoll创建一个新的epoll实例。在内核中创建了一个数据,这个数据中有两个比较重要的数据,一个是需要检测的文件描述

2022-06-08 23:26:54 234

原创 线程同步的机制

信号量互斥锁条件变量功能:当某个数据到达某个值的时候,唤醒等待在这个共享数据的线程

2022-06-08 21:20:09 311

原创 背包问题模板

你是否被背包问题惹得晕头转向,走过路过不要错过,模板一份奉上

2022-06-07 23:00:19 111

原创 进程间通信方法

进程间通信的方法- 管道- 共享内存- 消息队列- 信号量- 套接字

2022-06-07 20:52:28 128

原创 C++转型

新式C++类型转换主要包括四种

2022-06-06 21:50:55 250

原创 定制new和delete

当operator new抛出异常以反应一个未满足的内存需求之前,它会先调用一个客户指定的错误处理函数,一个所谓的new_handler。为了指定这个“用以处理内存不足的函数”,客户必须调用set_new_handler,那是声明的一个标准程序库函数new_handler定义出一个指针指向函数,该函数没有参数也没有返回任何东西set_new_handler则是获得一个new_handler并返回一个new_hander的函数set_new_handler声明式尾端的“throw()”是一份异常明细目标

2022-06-06 16:06:44 120

原创 线段树---C++模板

学习线段树数月,一直处于懵懂状态,直到找到一个线段树模板

2022-06-06 11:25:53 354

原创 C++智能指针

auto_ptr由于auto_ptr被销毁时会自动删除它所之物,所以一定要注意别让多个auto_ptr指向同一个对象。如果真的是那样,对象会被删除一次以上,而那会是你的程序搭上“未定义行为”的快速列车上,为了预防auto_ptrs,有一个不同寻常的性质:若通过copy构造函数或copy assignment操作符复制它们,它们会变成null,从而复制所得的指针将取得资源的唯一拥有权这是一个诡异的复制行为,附加上其底层条件:“受auto_ptr管理的资源必须绝对没有一个以上的auto_ptr同时指向它”,

2022-06-05 22:46:28 327

原创 以多态基类声明virtual析构函数

Factory函数会“返回”一个base class指针,指向新生置之derived class 对象“为了遵循factory函数的规矩,被getTimerKeeper()返回的对象必须位于heap。因此为了避免内存泄露和其他资源,将factory函数返回的每一个对象适当地delete掉很重要...

2022-06-05 18:07:14 99

原创 页面调度算法

当发生缺页中断时,操作系统必须在内存中选择一个页面将其换出内存,以便为即将调入的页面腾出空间。如果要患处的页面在内存驻留期间已经被修改过,那么它在磁盘上的副本已经是最新的,不需要诙谐,直接用调入的页面覆盖被淘汰的页面就可以了。在缺页中断发生时,有些页面在内存中,其中有一个页面很快被访问,其他页面可能要在10,100,1000条指令后才会被访问,每个页面都可以用在该页面首次被访问钱索要执行的指令作为标记。这个算法的唯一缺点是无法是实现,当却也中断发生时,操作系统无法知道各个页面下一次将在什么时候被访问。为使操

2022-06-02 14:45:55 203

原创 调度算法比较

调度准则调度算法(1) 先到先服务(First Come First Service, SCFS)缺点:平均等待时间会很长(2)最短作业优先(shortest job first, SJF)困难:如何知道下次CPU执行地长度(3)最短剩余时间优先(抢占SJF)(4)优先级调度(4) 轮转调度(Round Robin, RR)轮转调度短发时专门为分时系统设计的。它类似于FCFS调度,但是增加了抢占以切换进程。新进程添加到就绪队列的尾部。CPU调度程序从就绪队列中选择第一个进程,将定时器设置在一个时

2022-06-02 13:40:14 550

原创 右值引用与移动构造函数

左值:可以出现在等号左面右值:只可以出现在等号右面右值是为了解决不必要的拷贝构造。当赋值符号右面的是右值,左面的object可以去获取右面的object而不需要重新分配内存。字符串类Mystring的移动构造函数Mystring::Mystring(Mystring&& str)noexcept:_data(str._data),_len(str._len) { str._len = 0; str._data=NULL;//重要}字符串类Mystring的移动构造函数.

2022-05-26 22:57:08 158

原创 TCP正确关闭连接

发送端send()-------->发送端数据发完-------->接收端read返回0------>接收端close()--------->发送端read返回0------->发送端close()发送端关键代码 char buf[8192]; size_t nr = 0; while ( (nr = fread(buf, 1, sizeof buf, fp)) > 0) { stream->sendAll(buf, nr); } fclose

2022-05-26 18:55:52 1107

原创 C++可变参数案例

案例一void printX(){}template<typename T,typename...Types>void printX(const T& firstArg,const Types& ...args){cout<<firstArg<<endl;print(args...);}测试print(7.5,hello,bitset<16>(277),42);案例二void printf(const char* s)

2022-05-13 12:19:53 366 1

原创 堆排序C++实现

堆排序它的运行时间主要是消耗在初始建设堆和在建设堆时的反复筛选上在构建堆的过程中,因为我们是完全二叉树从最下层最右边的非终端节点开始构建,将它与其他孩子进行比较和若有必要的交换,对于每个非终端节点来说,其实最多进行两次比较和交互操作,因此整个构建堆的时间复杂度为o(n)o(n)o(n)在正式排序时第iii次取堆顶记录重建堆需要用o(log(i))o(log(i))o(log(i))的时间(完全二叉树的某个节点到根节点的距离为⌊log⁡2i⌋+1\lfloor \log_2i \rfloor+1⌊log

2021-09-15 20:21:42 192

原创 kruskal算法C++实现

kruskal算法int main() { int n = 5; // 顶点数 // 图用边表表示,第一个数据对表示边的两个节点,第二个数据是权重 std::vector <std::pair <std::pair <int, int>, int> > edge_list, mst; edge_list = { {{0, 1}, 20}, {{0, 2}, 50},

2021-09-15 20:19:36 621

原创 高斯分布,指数分布,gamma分布,chi_square分布之间的关系

卡方分布:若n个相互独立的随机变量ξ1,ξ2,…ξnξ_1,ξ_2,…ξ_nξ1​,ξ2​,…ξn​,独立同分布于标准正态分布,则这n个服从标准正态分布的随机变量的平方和构成一新的随机变量,其分布规律成为卡方分布指数分布:自由度为2的卡方分布伽马分布:自由度为n的卡方分布~gamma(n/2,1/2)。伽马分布可看成n个独立同分布的指数分布的和,因此可认为是发生n次独立事件的时间...

2021-09-13 15:53:36 3245

原创 二叉树遍历C++实现——深度优先

前序遍历struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode() :val(0), left(nullptr), right(nullptr) {}; TreeNode(int x, TreeNode* left, TreeNode* right) :val(x), left(left), right(right) {};};//递归法class Solution {publ

2021-09-08 22:53:10 732

原创 数据结构——二叉树

二叉树的特点:每个节点最多有两个子树左子树和右子树是顺序的,次序不能仍以颠倒即使数中树有一个子树,也要区分它是左子树还是右子树。特殊的二叉树斜树:所有节点都只有左子树的二叉树叫左斜树,所有节点都只有右子树的二叉树叫右斜树满二叉树:如果所有分支节点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树完全二叉树:对于一颗具有nnn节点的二叉树按层序编号,如果编号为iii的节点与同样深度的满二叉树中编号为iii的节点在二叉树中的位置完全相同,则这颗二叉树称为完全二叉树平衡二

2021-09-08 22:49:23 41

原创 SNR,S/N Es/N0,Eb/N0

S: 信号平均功率,单位W N: :噪声平均功率,单位W Eb: 每个bit的能量,单位J N0: 噪声功率谱密度,单位W/Hz=J Es: 信号(符号)的能量,单位J Rb: 传信率(每秒传输的bit数) W: 信号带宽 T: 符号周期 Ts: 采样点间隔 k: 每个数据包含的bit数SNR与S/NSNR是S/N的dB形式,即SNR=10log(S/N)S/N与Eb/N0和Ex/N0 S=Eb*Rb: 每bit的能量*传信率=信号功率,J/bit∗bit/s=J/s=wJ/..

2021-09-08 20:00:52 1040

原创 操作系统——死锁出现的条件及银行家算法

死锁现象的出现如果在缓存区已满的情况下,生产者进程想要继续往缓存区放入item,生产者会首先进行p(mutex)并成功地获得了互斥信息量mutex ;接下来生产者在要获得empty信号(即执行P(empty))时发现缓存区已满,从而停下来等待,当消费者进程执行P(mutex)时发现这个互斥信号量仍然被生产者进程占有而没有释放,当然消费者进程只能等待,等待生产正执行Item放入缓存区释放mutex。死锁出现地条件死锁发生地四个基本条件:(1)互斥:资源不能被共享,一个资源只能被一个进程使用。(2)不

2021-09-07 19:51:35 591

原创 操作系统——生产者消费者模型以及信号量

生产者——消费者问题是多个进程因共享一个缓存区而产生的相互依赖问题。具体来说,生产者进程往往要往共享缓存区中放内容、消费者进程从共享缓存中取内容, 当缓存区满的时候 ,生产者进程需要等待消费者进程取走内容, 当缓存区空的时候 ,消费者进程需要等待生产者放入东西。这种进程间的合作/依赖关系在计算机系统中非常常见,比如磁盘驱动程序和上层应用通过共享缓存区来交换数据内容,以磁盘为例,磁盘驱动程序是生产者模型,要讲磁盘中读取的内容放到共享缓存区中,上层应用程序是消费者进程,要从共享缓存区中取走内容交给用户处理。要

2021-09-07 19:50:52 1906 4

原创 操作系统——用户级线程的切换

线程实在一个地址空间下启动并交替执行多个程序。交替执行的多个线程可以由操作系统管理,也可以由用户程序自己管理。由用户程序自己管理的线程对操作系统透明,操作系统完全知道这些线程的存在,这样的线程被称为用户级线程。相应的,由操作系统管理的线程是内核级线程。(1)用户级线程的切换就是在切换位置上调用Yield函数(2)Yield函数完成的基本工作是找到下一个线程的TCB。根据当前线程的TCB和下一个线程的TCB完成用户栈的切换。具体来说,就是将寄存器ESP中的值保存在当前线程的TCB中,然后从下一线程的TC

2021-09-07 18:55:56 1019 1

原创 类型转换运算符

类型转换运算符是类的一种特殊成员函数,它负责将一个类类型的值转换成其他类型。类型转换函数的一般形式如下所示operator type()const;其中type表示某种类型。类型转换运算符可以面向任意类型定义。只要该类型能作为函数的函数类型。因此,我们不允许转换成数组或者函数类型,但允许转换成指针或者引用类型类型转换运算符即没有显示的返回类型,也没有形参,而且必须定义成类的成员函数。类型转换运算符通常不应该改变待转换对象的内容,因此,类型转换运算符一般被定义成const成员定义含有类型转换运算符的

2021-09-05 10:12:38 1638

原创 C++重载函数调用运算符,“行为像函数一样”

如果我们重载了函数调用运算符,则我们可以像使用函数一样使用该类的对象。因为这样的类同时也能存储状态,所以与普通函数相比他们更加灵活举个简单的例子,下面这个名为absInt的struct含有一个调用运算符,该运算符负责返回其参数的绝对值struct absInt{ int operator()(int val)const { return val<0?-val:val; }}这个类只定义一种才做:函数调用运算符,它负责接受一个int类型的实参,然后返回该实参的绝对值。我们使用调用运算

2021-09-03 23:18:29 308

原创 C++重载成员访问运算符

再迭代器类及智能指针类中常常用到解引用运算符和箭头元素安抚class StrBlobPtr{public: std::string&operator*()const {auto p=check(curr,"dereference past end"); return (*p)[curr]; } std::string*operator->const { return & this->operator*() }}解引用运算符首先检查curr是否仍在工作范

2021-09-03 20:55:50 236

原创 操作系统——内核态与用户态

无论是 操作系统内核代码还是应用程序代码都是装入内存后执行的,因此,内核态代码和用户态代码放置的区域不同。如图所示,内核态代码不能通过jmp指令跳转到内核态内存区域中,用户态代码也不能用mov指令访问(“取走”)存放在内存中的数据。内存的使用是操作系统统一管理的,操作系统可以在内存中划定一个区域,并且设置这个区域的特权级。操作系统将自己所在的内存区域的特权级设置得很高,用户程序所在得区域设置得低一些。在用户程序执行时每访问依次内存都做一次审查,如果要访问的区域的内存区域比自己的特权高,CPU会拒绝执行。.

2021-09-03 19:23:17 277

原创 操作系统启动过程

操作系统启动过程五段论第一阶段:启动扇区1.将启动磁盘启动扇区中的内容读到内存的0x7c0地址出,并设置寄存器cx=0x7c0,IP=0x0000 BOOTSEG = 0x07c0 INITSEG = 0x9000 !DS:SI !DS<<4+SI=0x7c00 mov ax,#BOOTSEG mov ds,ax !ES:SI !ES<<4+DI=0x9000 mov ax,#INITSEG mov es,ax mov cx,#2

2021-09-03 18:33:13 434

原创 无线信道模型

大尺度衰落表征平均接收信号强度与收发机距离的关系,通常距离尺度范围在数十—数千米范围主要包含和距离相关的路径损失和阴影小尺度模型表征小尺度空间(一个或者多个波长尺度)信号幅度的快速变化来自不同方向的电磁波信号的叠加产生小尺度衰落可能变化高达30-40dB,大尺度衰落的结果可以看成小尺度衰落在几十波长量级上的平均信号模型发送接收信号均为是信号发送接收信号均可表示为复信号的实部s(t)=R{u(t)ej2πfc(t)}=sI(t)cos(2πfct)+sQ(t)sin(2πfct)

2021-09-02 19:20:35 421

原创 C++交换

如果一个类定义了自己的swap,那么算法将使用类自定义版本。否则,算法将使用标准库定义的swap。虽然与往常一样我们不知道swap是如何实现的,但理论上很容易理解,为了交换两个对象我们需要进行依次拷贝和两次赋值。例如,交换两个值HasPtr对象的代码可能像下面这样:HasPtr temp =v1;//创建v1的值的一个临时副本v1=v2;//将v2的值赋予v1v2=temp;//将保存的v1的值赋予v2这段代码将原来的v1中的string拷贝了两次—第一次是HasPtr的拷贝狗杂函数将v1创建给v

2021-09-01 23:26:34 850

原创 拷贝控制和资源管理——行为像值的类、行为像指针的类

类的行文像一个值,意味着它应该也有自己的状态。当我们拷贝一个像值得对象是,副本和原对象是完全独立的。改变副本对原对象有任何印象,反之亦然.行为像指针的类则共享状态,当我们拷贝一个这种类的对象时,副本和原对象使用相同的底层数据。改变副也会改变原对象,反之亦然行为像值的类假设一个HasPtr类,有两个成员,一个int和一个string指针。为了提供类值得行为,对于类管理的资源,每个对象都应该拥有一份自己的拷贝。这意味着对于ps指向的string,每个HasPtr对象都必须有自己的拷贝。为了实现类值得行为

2021-09-01 22:31:52 249 1

原创 C++组织拷贝

定义删除的函数在新标准下,我们可以通过拷贝构造函数和拷贝赋值运算符定义为删除函数来组织拷贝。删除的函数时这样一个函数:我们虽然声明它们,但不能以人恶化方式使用它们。在函数的参数列表后面加上=delete来指出我们希望将它删除:struct NoCopy{NoCopy()=default();//使用合成的默认构造函数NoCopy(const NoCopy&)=delete;//阻止拷贝NoCopy& operator=(const NoCopy&)=delete;//组织赋

2021-09-01 20:27:53 55

原创 C++使用=default

我们可以通过将拷贝控制成员定义为=default来显示地要求编译器生成合成地版本class Sales_data{public: Sales_data()=default; Sales_data(const Sales_data&)=default; Sales_data& operator=(const Sales_data&); ~Sales_data()=default;};Sales_data& ::operator=(const Sales_data

2021-09-01 19:52:04 1883

原创 C++三五法则

需要析构函数的类也需要拷贝和赋值操作当我们决定一个类时候要定义它自己版本的拷贝构造控制成员时,一个基本元组时首先确定这个类是否需要一个析构函数。通常,对析构函数的需求要比对拷贝狗奥挥着复制构造运算符的需求更为明显。如果这个类需要一个析构函数,我们机会可以肯定他也需要一个靠别构造函数和一个拷贝赋值运算符。class HasPtr{public: HasPtr(const std::string &s=std::string()):ps(new std::string(s)),i(0){} ~

2021-09-01 19:38:52 197

原创 C++析构函数

析构函数执行与构造函数相反的操作;构造函数初始化对象的非static数据成员,还可能做一些其他工作;析构函数释放对象使用的资源,并销毁对象的非static数据成员。析构函数是类的一个成员函数,名字由波浪号接类名构成,它没有返回值,也不接受参数class Foo{public: ~Foo();//析构函数 //...}由于析构函数不接受参数,因此它不能被重载。对一个给定类,只会有唯一一个析构函数。析构函数完成什么工作如同构造函数有一个初始化部分和一个函数体,析构函数也有一个函数体和一个析构

2021-09-01 19:05:45 91

原创 C++拷贝赋值运算符

重载赋值运算符重载运算符本质上是函数,其名字由operator关键字后接表示要定义的运算符的符号组成。因此,赋值运算符就是一个名为operator=函数。类似于任何任何函数,运算符函数也有一个返回类型和一个参数列表、重载运算符的参数表示运算符的运算对象,某些运算符,包括赋值运算符,必须定义为成员函数。如果一个运算符是一个成员函数,其左侧运算对象就绑定到隐式的this参数。对于一个二元运算符,例如赋值运算符,其右侧运算对象作为显示参数传递。拷贝赋值运算符接受一个与其类相同类型的参数class Foo{

2021-09-01 16:21:31 1157 1

原创 C++拷贝构造函数

如果一个构造函数的第一个参数是自身类型的引用,且任何额外参数都有默认值,则此构造函数时拷贝构造函数class Foo{public: Foo();//默认构造函数 Foo(const Foo&)//拷贝构造函数}拷贝构造函数的第一个参数必须是一个引用类型。虽然我们可以定义一个接受非const引用的拷贝构造函数,但此参数几乎总是一个const的引用。拷贝构造汉纳树在集中情况下都会被隐式地使用。因此,拷贝构造函数通常不应该是explicit的合成拷贝构造函数如果我们没有为一个类定义拷贝

2021-09-01 15:54:46 68

原创 allocator 类

new 有一些灵活性上的局限,其中一方面表现在它将内存分配和对象构造组合在了一起。类似的,delete将对象析构和内存释放组合在了一起,我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起。因为在这种情况下,我们几乎肯定直到对象应有什么值。当分配一大块内存时,我们通常计划在这块内存上按需构造对象,在此情况下,我们希望将内存分配和对象构造分离。这意味着我们可以分配大块内存,但只在真正需要时才真正执行对象创建操作。allocator类标准库allocator类型定义在头文件memory中,它帮助我

2021-08-31 21:49:04 262

powerpoints.zip

powerpoints.zip

2022-07-08

空空如也

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

TA关注的人

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