自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 排序(重点介绍快速排序的各种场景, 堆排序的数组空洞)

这里介绍了排序算法的各种场景, 以及相应的优化。 以及堆排序发生数组空洞时的解决方案, 以及如何分析堆排序的时间复杂度。

2021-12-08 14:36:21 1728

原创 互斥锁和条件变量

同步概念通信中的同步指协同步调,按预定的先后次序运行线程同步, 指一个线程发出某一个功能调用时。在没有得到结果之前,该调用不返回,同时其他线程为保证数据一致性,不能调用该数据。“同步”的目的,是为了避免数据混乱,解决与时间无关的错误。实际上,不仅线程间需要同步,进程间,信号间都需要同步机制。数据混乱原因:资源共享调度随机线程间缺少必要的同步机制数据混乱代码两个线程更改一个共享变量。可以发现两个线程之间并不正确地给共享变量counter递增。#include "head.h"#de

2021-07-24 17:08:38 364 2

原创 线程的创建,终止和回收

线程线程概念线程:轻量级的进程,其本质仍是进程。(在Linux环境下)进程: 具有独立的地址空间,拥有pcb线程:有独立的pcb,但是没有独立的地址空间(共享)Linux下:线程:最小的执行单位进程:最小分配资源单位,可看成只有一个线程的进程。ps -Lf 去看看firefox进程控制块 PCB每个进程在内核中都有一个进程控制块(PCB)来维护进程相关信息,Linux内核的进程控制块是task_struct结构体。其内部成员有很多,我们大致了解一部分进程的状态,有就绪、运行、挂起、

2021-07-22 22:32:01 340 1

原创 select实现多路IO转接

select函数介绍#include <sys/time.h>#include <sys/types.h>#include <unistd.h>int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);void FD_CLR(int fd, fd_set *set);int FD_ISSET(int

2021-07-22 10:31:50 189 3

原创 EPOLL服务器流程

EPOLL服务器流程使用cat命令去查看一个进程可以打开的socket描述符上限cat /proc/sys/fs/file-max9223372036854775807突破文件描述符1024限制修改:- 打开sudo vi /etc/security/limits.cof -->设置默认值,可以直接借助命令- 在文件尾部写入 * soft nofile 10000* hard nofile 20000记住要用tab键去对齐。epoll系列系统调用

2021-07-22 10:26:17 551 1

原创 makefile项目管理

makefile项目管理命名 Makefile makefiletouch makefile创建之后编译makefile文件按这样的格式进行目标:依赖文件 (一个tab缩进)命令举个例子hello:hello.cpp g++ hello.cpp -o hello目标:生成的hello依赖:使用hello.cpp生成的假设我们写个下面这样的makefile,但是没有hello.o文件,就会报错hello:hello.o g++ hello.cpp -o

2021-06-10 21:10:59 201

原创 前缀和+哈希表 连续的子数组和 leetcode53题

连续的子数组和题目看到该题,一帮来讲能够想到使用前缀和来写。前缀和比如nums = [23, 2, 4, 6,7] ,k =6这时候会想到去用一数组 sums[n]sum[0] = nums[0];for(int i=1;i<n;i++){ sum[i] = sum[i-1]+nums[i];}得到前缀和后,又得设置两个索引i 和j, 因为这里求的是子数组,比如[2,4]就需要 sum[3] - sum[0]然后求余得到0去判断。前缀和+ 哈希表但是因为nums.len

2021-06-03 09:42:55 130

原创 pImpl设计如何将文件编译关系降低

将文件间的编译关系降至最低其中一个头文件发生改变,其他的都得重新编译。但你的C++程序中的某个class实现文件做了轻微的修改,(这里的修改指的不是class接口,而是实现,而且只改private成分。因为只有一个class修改,当时输入make后发现这个世界都重新编译和链接了,问题出在哪里?class Person{public: Person(const std:string &name, const Date& birthday, const

2021-06-01 23:22:01 109

原创 使用setsockopt实现端口复用

端口复用使用场景我们知道主动关闭连接方,最终会进入一个状态——timewait, 而当服务器主动关闭的时候,它会进入这个状态并等待2MSL的时长。假设一个场景,当服务器需要更新时, 需要服务器主动关闭连接,这时候服务器就需要等待2msl才能使用这个端口,对于用户而言,2msl的时长太长,(linux的2msl时长大约有40s到60s),所以需要复用这个端口,使得服务端能够正常运行。函数简介#inlude<sys/socket.h>int getsockopt(int sockfd,

2021-05-26 09:58:22 2328

原创 三次挥手?说好的四次挥手呢?(顺带解释三次握手和四次挥手)

问题来源某日摸鱼的时候,用wireshark抓包。发现只有三次挥手过程,但教科书上都说是三次握手和四次挥手的。那么这就来解释一下这种现象。在解释这个现象之前,大致简述三次握手和四次挥手,有基础的同学直接跳过三次握手和四次挥手...

2021-05-24 18:10:03 160

转载 explicit构造函数

转载于GGBeng大佬链接在此explicit构造函数前面是扫盲部分,可直接看后面的精华部分。扫盲一、隐式的类类型转换1. 转换构造函数如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则2. 从参数类型向类类型隐式转换的实例//在Sales_data类中,接受string的构造函数和接受istream的构造函数分别定义了从这两种类型向Sales_data隐式转换的规则。//即,在需要使

2021-05-17 22:48:01 4379

原创 通过位操作来遍历子集 leetcode题5759

用位操作来遍历子集5759. 找出所有子集的异或总和再求和额, 再做周赛的时候,我被一道简单题卡住了。(too 菜),然后看了大佬的题解,都有用移位操作来实现子集遍历(当时一脸懵),所以记录一下这种遍历题目原题5759 找出所有子集的异或总和再求和一个数组的 异或总和 定义为数组中所有元素按位 XOR 的结果;如果数组为 空 ,则异或总和为 0 。例如,数组 [2,5,6] 的 异或总和 为 2 XOR 5 XOR 6 = 1 。给你一个数组 nums ,请你求出 nums 中每个 子集 的

2021-05-16 15:19:23 119

原创 动态规划 解决二维最大子序和问题---滚动数组

动态规划之最大数组和系列啊 ,最近实在是刷不下去动态规划了,累了累了,所以还是把之前一些比较虐我的题整理一下。题目编号53. 最大子序和最大子矩阵矩阵区域不超过k的最大数组和再了解滚动数组法之前,先不做难题,先看看最基本的问题——最大子序和最大子序和给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6

2021-05-14 17:03:39 347

原创 gcc编译四步曲

gcc编译四步预处理、编译、汇编、链接预处理gcc -E hello.c —> hello.i展开宏、头文件替换条件编译删除注释、空行、空白编译gcc -Shello.i —> hello.s检查语法规范汇编gcc -chello.s —> hello.o将汇编指令翻译成机器码至于-o 是指定完成处理后的文件名链接数据段合并地址回填总结编译消耗资源、系统资源最多。gcc编译参数指定头文件目录 -Igcc -I指定头文件位置头文

2021-05-10 18:44:41 160

原创 怎么制作静态库和共享库 C++/C

静态库和共享库(动态库)假设有一个库文件,大小为50M,有100个源文件需要调用它,这里统一源文件的大小为10k对于静态库,每个源文件需要开辟出静态库的空间,那么总共需要的空间大小就是(10k + 50M) * 100;对于动态库,每个文件都是使用同一个共享库,只需要有库本身的空间即可(10k×100) + 50M那么动态库岂不是能够乱杀静态库。nonono,并不是。假设库里面有三个函数,当从静态库调用这三个函数时,它是等效与调用源文件本身的函数的,而源文件从动态库调用这三个函数时,由

2021-05-10 18:40:38 1017 5

原创 DV算法引发的链路故障

DV算法DV算法是一个迭代的、异步的和分布式的算法,而LS算法是一种使用全局信息的算法。分布式 每个节点都要从一个或多个直接相连邻居接收信息,执行计算,将计算结果发给邻居异步 它不要求所有节点相互之间步伐一致地操作迭代因为此过程要一直持续到邻居之间没有更多的信息为止。DV算法和Bellman-Ford方程相关dx(y)=minx{c(x,y)+dv(x,y)} d_x(y) = min_x\{c(x,y) + d_v(x,y)\} dx​(y)=minx​{c(x,y)+dv​(x,y)}

2021-05-10 18:39:35 585

原创 IPv4数据报格式和Ipv6数据报格式(长文,详细解释每个字段)

IPv4数据报介绍版本号。这4比特规定了数据包的IP协议版本。通过查看版本号,路由器能够确定如何 解释IP数据报的剩余部分。因为不同版本的IP数据包的格式是不一样的。首部长度。 IPv4数据报可包含一些可变数量的选项(这些选项包括在ipv4数据报首部中),所以利用这4比特来确定IP数据报中载荷实际开始的地方。大多数IP数据报不会包含选项,所以IP数据报的首部一般是20字节。服务类型。服务类型(TOS)比特包含在IPv4首部中,以便不同类型的IP数据报能够互相区别开来。例如将实时数据报(IP电话应用

2021-04-27 20:40:46 4256

原创 printf打印不出来?cout却可以

printf打印不出来,cout去可以?今天在编写关于网络编程的程序时,printf函数硬是答应不出来,而cout可以,为什么?大家都知道,服务器为了得到客户端的请求,是会用一个while循环去等待客户端的。而正是因为这个while导致了printf的内容放在缓存区里面没有刷出来。标准情况是等缓存区满了以后才输出,称为标准输出流。举个例子#include<stdio.h>int main(){ int a = 10; printf("%d", a); while(1){ a

2021-04-26 22:21:36 1639 1

原创 可靠数据传输(二) 滑动窗口协议和选择重传协议

可靠数据传输(二) GBN 和选择重传GBN 回退N步协议在回退N步协议中,允许发送方发送多个分组但也受限于在流水线中未确认的分组不能超过某个最大允许数N。send_base之前的是已发送并确认的分组send_base到nextseqnum是已发送但未确认的分组N是窗口的长度,那么[nextseqnum,send_base+N]是可以立即发送的分组。FSM描述GBN发送方的FSM描述GBN发送方必须相应三种类型的事件上层的调用。当上层调用rdt_send(data)时,发送方

2021-04-21 21:32:21 1125

原创 Core Dump (Segmentation fault) in C/C++

今天摸算法题的鱼的时候,写了一个头文件和cpp文件。然后不小心把头文件给编译了,然后在cpp文件去使用h文件时,总是报Core Dump (Segmentation fault)这个错误。段错误(核心转移)解决方法:把头文件编译出来的o文件给删了,一切解决。这里Max_Sum…balabala是头文件,然后test.cpp是调用这个头文件来测试的,可以看到还有一个Max…balabala是o文件,把这个删了,就没有毛病了。...

2021-04-21 17:49:20 151

原创 多路分解和多路复用简述

熟悉一下网络层在提到多路分解和多路复用之前先了解一下大概运输层和网络层之间的关系。网络层是提供不可靠的传输服务。网络层协议有一个名字叫做IP,即网际协议。IP为主机之间提供了逻辑通信。IP的服务模型是尽力而为交付服务,但它不做任何保证。它不确保报文段的交付不保证报文段的按序交付不保证报文段中数据的完整性。所以将网络层的IP叫为不可靠服务TCP和UDP所提供的服务TCP和UDP最基本的责任是:将两个端系统间IP的交付服务扩展为运行在端系统上两个进程之间的交付服务。简单来说,网络层实现的主机

2021-04-21 14:27:00 745 1

原创 C++ 可变参数函数模板 以及包扩展

可变参数模板就是一个接受可变数目参数的模板函数或模板类。可变数目的参数被称为参数包。存在两种参数包:模板参数包 表示零个和多个模板参数函数参数包 表示零个和多个函数参数template <typename T, typename ... Args>void foo (const T&t, const Args& ... rest);int i = 10;double d = 2.2;string s = "www";foo(i,s,42,d); //包中有三个

2021-04-17 17:04:14 1042 1

原创 引用折叠 C++

C++ 中的引用折叠引言先来定义一个函数模板,其中的参数是一个右值引用。template <typename T> void f3(T&&);f3(42);正常绑定规则告诉我们可以传递给它右值。那如果int i =10;f3(i);这里给f3调用了左值,按道理这是不ok的,但是C++在正常规则下定义了两个例外规则。第一个例外规则第一高例外规则影响了右值引用参数的推断,当我们将一个左值传递给函数的右值引用参数,且右值引用指向模板类型参数如(T&&

2021-04-15 21:51:22 596

原创 类型转换与模板类型参数

类型转换与模板类型参数在非模板函数中, 在函数调用中,传给函数的实参被用来初始化函数的形参。如果实参和形参不是同种类型,通常来讲是会报错,除非存在自动类型转换。而对于模板函数而言,编译器不是对类型进行转换,而是产生新的模板实例。const转换:可以将一个非const对象的引用(或指针)传递给一个const的引用(或指针)形参。数组或函数指针转换:如果形参不是引用类型,则可以进行对数组或函数类型的实参应用正常的指针转换。一个数组实参可以转换为一个指向其首元素类型的指针。类似的,一个函数实参可以转换为

2021-04-15 19:24:27 258

原创 类模板和友元

类模板和友元如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例。如果友元自身是模板,类可以授权给所有模板实例,也可以只授权给特定实例。一对一友好关系类模板和另一个模板(类或函数)建立友好关系的最常见模式是建立对应实例及其友元间的友好关系。template<typename> class BlobPtr;template<typename> class Blob;template<typename T> bool operator==(con

2021-04-14 19:48:47 475

转载 leetcode 前缀树

Trie [traɪ] 读音和 try 相同,它的另一些名字有:字典树,前缀树,单词查找树等。介绍 Trie????Trie 是一颗非典型的多叉树模型,多叉好理解,即每个结点的分支数量可能为多个。为什么说非典型呢?因为它和一般的多叉树不一样,尤其在结点的数据结构设计上,比如一般的多叉树的结点是这样的:struct TreeNode { VALUETYPE value; //结点值 TreeNode* children[NUM]; //指向孩子结点};而 Trie

2021-04-14 14:51:08 402

原创 操作符重载 成员函数还是friend函数。

引言操作符重载是可以用成员函数,也可以用友元函数的,但是什么时候用成员函数、还是用友元函数。用成员函数的情况C++规定,以下操作符必须使用成员函数赋值运算符 =下标运算符 [ ]函数调用运算符 ( )成员运算符 ->用友元函数的情况<<操作符>>操作符为什么<<操作符就不能够使用成员函数进行定义?因为在成员函数中,操作运算符必须是左操作符的成员。而在<<操作符中,左操作符应该是ostream对象,而ostream对象是标准

2021-04-14 09:35:24 335 2

原创 C++ 类的虚析构函数

虚析构函数class Quote{public: virtual ~Quote()=default;};和其他虚函数一样,析构函数的虚属性也会被继承,无论是使用合成的析构函数还是自己定义的析构函数,都是虚析构函数。当使用一个动态分配的对象,也有可能出现静态类型和动态类型不符合的情况...

2021-04-12 21:10:05 340

原创 C++ 继承中的类作用域

继承中的类作用域在继承中,派生类的作用域是嵌套在基类里面的。如果一个名字在派生类内不能得到正确的解析,那么编译器会外层的基类作用域寻找该名字的定义。//Quote基类class Quote{private: string bookNo;protected: //保护权限,子类是能够继承的 double price = 0.0;public: string isbn() const {return bookNo;}};// 继承了Quote的Disc_quotecl

2021-04-11 21:59:54 218

原创 C++ 类继承中的访问权限和友元的继承关系

继承方式继承方式有三种,分别是公有,私有,和受保护继承。公有class Base{};class Dirved1:public{};私有class Base{};class Dirved1:private{};//默认情况下是私有class Dirved1:{}受保护class Base{};class Dirved1:protected{};访问权限某个类的成员的访问权限受到两个因素影响。一是基类在该成员的访问符二是派生类在派生列表中的访问符

2021-04-11 19:10:46 256

原创 C++ 虚函数

虚函数通常情况下, 但我们不使用函数,就不需要给这个函数下定义。但是我们必须对每个虚函数下定义,不管它是否会被用到。因为在C++中,使用基类的引用或指针调用一个虚函数时会使用动态绑定,所以我们直到运行时才知道是使用哪个类的虚函数(是派生类的还是基类的)。可以参考动态类型和静态类型的知识点double print_total(ostream &os,const Quote &item, size_t n){ double ret = item.net_price(n);

2021-04-10 19:55:51 288

原创 派生类和基类的类型转换(动态和静态)

现在有基类Quote和派生类Bulk_quoteQuote.h#include<string>using namespace std;class Quote{private: string bookNo;protected: double price = 0.0;public: Quote()=default; Quote(const string &book, double sales_price):bookNo(book), price

2021-04-10 19:11:13 261

原创 leetcode 旋转数组系列 二分查找

题目1leetcode题解链接解析旋转数组由于该数组是升序排序,经过旋转后,最小值右边的数严格大于最小值,最大值左边的数严格小于最大值。那么可以用二分查找的方法来解决这道题目,因为可以确定最小值一定在low和high之间,然后通过更新pivot来减小搜索区域。基本上会出现两种情况。nums[pivot]小于nums[high],这说明了nums[pivot]是最小值右边的数nums[pivot]大于nums[high],这说明来nums[pivot]是最小值左边的数。由于该数组不包含重复

2021-04-09 18:38:11 282

原创 右值引用 移动操作 C++

右值引用我们使用&&进行右值引用,而常规引用是使用&。右值引用有一个重要特性就是只能绑定到一个将要销毁的对象。左值引用不能将和要求转换的表达式、字面常量或是返回右值的表达式。#include<iostream>using namespace std;int main(){ int i = 42; int &r = i; //正确 引用i //int &&rr = i; //i是左值,所以不能被右值引用rr所引用。

2021-04-08 20:50:27 161

原创 leetcode 表示数值的字符串 剑指offer 有限状态机

参考文章题目有限状态机确定有限状态机是一个计算模型。它包含一系列状态。这些状态中:有一个特殊的状态,被称为初始状态还有一系列状态被称为[接受状态],其中初始状态也可以是接受状态。自动机转移思想一开始,这个自动机处于初始状态,随着字符串的读取,该自动机会根据当前的状态和被读取的字符,按照某个事先约定好的规则,从当前状态转移到下一个状态。当状态转移完成后,就继续读取下一个字符,以此类推。当字符串被读取完了,自动机处于接受状态,那么则判定该字符串处于「接受状态」,否则,判定它为「拒绝状态」。

2021-04-08 08:56:11 106

原创 Ubuntu系统 vscode配置C++

1. vscode下载去vscode官网下载.deb版本的vscode官网随后cd到对应的目录(下载文件的目录),然后sudo dpkg -i code_1.31.1-1549938243_amd64.debdpkg对应的文件具体的可以看这个链接2.下载对应的插件

2021-04-07 22:46:05 251

原创 C++ =default和=delete

什么是合成版本合成版本就是指编译器自己生成的版本。如合成拷贝函数,合成拷贝赋值重载,合成析构函数合成拷贝函数 能够将被拷贝的对象的成员的值拷贝到新对象合成拷贝赋值函数 能够将赋值运算符的右侧对象的非static成员赋予左边对象的对应成员。合成析构函数为空=default 显式要求合成版本我们可以使用控制成员定义为=default来显式地要求编译器生产合成的版本当我们在类内使用=default修饰成员的声明时,合成的函数会隐式地声明为内联的。当我们在类外使用=default,就是不希.

2021-04-06 14:35:09 190

原创 C++ allocator类

C++ allocator类将内存分配和对象构造组合在一起引起的浪费C++ new和动态数组在使用动态数组,new操作是将分配内存和构建对象组合在一起,delete操作是把对象析构和内存释放组合在一起。但是在分配一大块内存时,希望能够将内存分配和对象构造分离起来,避免构建一些用不到的对象。将内存分配和对象构造组合在一起引起的浪费string *const p = new string[n];stirng s;string *q = p;while(cin >> s &&a

2021-04-04 23:26:55 146

原创 C++ new和动态数组

new运算符通常来讲,new和delete运算符一次分配/释放一个对象,但是某些应用需要一次分配/释放多个对象。于是C++语言定义了另一种new表达式语法,可以分配并初始化一个对象数组。new和数组//调用get_size()确认要创建多少个对象。int *pia = new int[get_size()]; //pia指向第一个int分配一个数组会得到一个元素类型的指针虽然我们称new T[]分配的内存为“动态数组”,但是当用new分配一个数组时,我们没有得到一个数组类型的对象,而是得到一个

2021-04-04 20:51:41 882

原创 weak_ptr “弱“的智能指针

weak-ptrweak_ptr 是一种不控制所指向对象生存期的智能指针,它指向由一个shared_ptr管理的对象。将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放。即使有weak_ptr指向对象,对象还是会被释放。weak_ptr操作功能weak_ptr w空weak_ptr可以指向类型为T的对象weak_ptr w(sp)与shared_ptr sp指向相同对

2021-04-03 16:19:31 100

空空如也

空空如也

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

TA关注的人

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