自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 cpp-httplib库的简介与工作流程

A C++11 single-file header-only cross platform HTTP/HTTPS library.It’s extremely easy to setup. Just include the httplib.h file in your code!NOTE:This is a multi-threaded ‘blocking’ HTTP library. If you are looking for a ‘non-blocking’ library, this is.

2021-07-05 22:49:45 8626

原创 设计只能创建一个对象的类(单例模式)

单例模式一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。饿汉模式程序启动时就创建一个唯一的实例对象。class Singleton{ static Singleton* getInstance() { return &

2021-06-07 17:11:34 1251

原创 HTTP(超文本传输协议)详细解析

文章目录概念http协议格式首行请求行请求方法URLurlencode和urldecode协议版本HTTP0.9HTTP1.0HTTP1.1HTTP2.0响应行响应状态码状态码描述头部常用头部字段cookie无状态协议流程cookie不安全sessioncookie和session区别空行正文概念HTTP(HyperText Transfer Protocol)即超文本传输协议,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应,是一个明文字符串传输协议,是一个简单的请求—响应协议。htt

2021-06-07 11:26:23 2336

原创 海量数据处理题

题目一给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法。如何扩展BloomFilter使得它支持删除元素的操作精确结果注意不能直接使用位图假设将文件1中的每条query映射到位图中,然后检测第二个文件中的query是否在位图中出现过。在用query对位图进行操作时,必须将query转换为整形数字,而两个不同的query可能会转化为同一个记录,再到位图中进行查找 时,可能就会认为这两条query是同一个,而将其当成交集,就会出错,结果就

2021-06-04 16:41:56 288

原创 C++11右值引用

左值与右值左值与右值是C语言中的概念,但C标准并没有给出严格的区分方式,一般认为:可以放在=左边的,或者能够取地址的称为左值,只能放在=右边的,或者不能取地址的称为右值,但是这并不是完全准确。比如:a,b都是左值,b既可以放在=左侧也可以放在右侧。int a = 10;int b = 20;a=b;b=a;左值与右值很难区分,一般认为:普通类型的变量,可以取地址,都认为是左值。const修饰的常量,不可修改,只读类型的,理论上应该按照右值对待,但因为其可以取地址,C++11认为其是左

2021-06-02 13:14:41 132

原创 unordered_map和unordered_set的模拟实现

定义哈希表(Hash table,也叫散列表),是根据关键字值(key,value)直接进行访问的数据结构。也就是说,它通过把关键字映射到表中一个位置来访问的纪录,以加快查找的速度。这个映射函数叫做散列函数,存放纪录的数组叫散列表。基本原理使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标,hash值)相对应,于是用这个数组单元来存储这个元素。哈希冲突通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致经过哈

2021-05-28 14:15:26 183

原创 TCP的客户端、服务器端socket编程

使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如下 :1、socket函数无论是客户端还是服务器端,都需要创建一个socket,该函数返回socket标识符。socket是一个结构体,被创建在内核中。sockfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //AF_INT:ipv4, SOCK_STREAM:tcp协议2、connect函数客户端创建了socket后,需要和服务器端建立连

2021-05-25 15:14:42 737

原创 红黑树模拟实现

#include <iostream>#include <utility>using namespace std;enum Color{ RED, BLACK};template<class V>struct RBNode{ RBNode<V>* _left; RBNode<V>* _right; RBNode<V>* _parent; Color _color; V _val; RBNode(const

2021-05-21 14:39:09 222

原创 求最大连续bit数

求最大连续bit数链接:https://www.nowcoder.com/questionTerminal/4b1658fd8ffb4217bc3b7e85a38cfaf2来源:牛客网求一个byte数字对应的二进制数字中1的最大连续数。例如3的二进制为00000011,最大连续2个1。输入描述:输入一个byte数字输出描述:输出转成二进制之后连续1的个数示例1输入35输出21说明3的二进制表示是11,最多有2个连续的1。5的二进制表示是101,最多只有1

2021-05-16 12:44:10 219

原创 AVL树四种旋转详解

平衡二叉树平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡因子某结点的左子树与右子树的高度(深度)差即为该结点的平衡因子(Balance Factor)。平衡二叉树上所有结点的平衡因子只可能是 -1,0 或 1。四种旋转情况往平衡二叉树中添加节点很可能会导致二叉树失去平衡,所以我们需要在每次插入节点后进行平衡的

2021-05-16 11:13:08 1407

原创 map中的[ ]重载(map::operator[])

其中我们可以见到调用[]就相当于执行下面我们来分析这段代码:make_pair(k,mapped_type()创建一个pair对象,内容 k—value缺省值this->insert(make_pair(k,mapped_type())插入第一步创建的pair对象成功,返回pair<pair对象的迭代器,true>失败,返回pair<已经存在键值为k的pair对象迭代器,false>(this->insert(make_pair(k,mapp

2021-05-12 13:18:56 1031

原创 二叉搜索树实现

删除分情况当前节点没有左右孩子可直接删除当前节点只有左孩子可直接删除当前节点只有右孩子可直接删除当前节点有左右孩子当前节点左右孩子都存在,直接删除不好删除,可以在其子树中找一个替代结点。找其左子树中的最大节点,即左子树中最右侧的节点,或者在其右子树中最小的节点,即右子树中最小的节点。替代节点找到后,将替代节点中的值交给待删除节点,转换成删除替代节点#include <time.h>#include<iostream>using namespace std

2021-05-12 11:11:58 120

原创 网络基础(IP地址、端口、通信协议、字节序)

IP地址什么是ip地址ip协议给因特网上的每台计算机和其它设备都规定的地址,是网络中每一台主机的唯一标识。有了这种地址,才保证用户在连网的计算机上操作时,能够高效而且方便地从很多计算机中选出自己所需的对象来。2.IP协议的分类?ipv4IP地址是一个4字节,32位的整数产生的IP地址个数:2^32大约等于43亿ipv6IP地址是一个16字节,128位的整数产生的IP地址个数:2^12843亿IP地址肯定不能满足现如今的使用,所以出现了IPv6网络协议版本。但是,IPv6网络协议版本,不兼容I

2021-05-12 10:43:07 607 3

原创 多线程—(3.线程应用)

线程应用线程池应用场景优势实现代码线程安全的单例模式饿汉实现方式和懒汉实现方式饿汉实现方式懒汉实现方式线程池一种线程使用模式,线程过多会带来调度开销,进而影响缓存局部性和整体性能。线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。实际上就是一堆线程(有最大数量限制)+ 线程安全的任务队列。应

2021-05-01 00:02:56 132 1

原创 C++多态详解

多态的概念当不同的对象去完成某个行为时会产生出不同的状态。比如:买火车票,普通人是全价,学生是半价,儿童是免票。多态的定义和实现在了解多态的构成条件之前,我们首先要了解虚函数和重写。虚函数被virtual修饰的类成员函数称为虚函数。class person{public: virtual void buyTicket() { cout << "买票——全价" << endl; }};重写派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚

2021-04-28 18:12:46 337

原创 继承

继承的概念和定义继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段。它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。示例:#include<iostream>using namespace std;class Animal{public: void Print() { co

2021-04-26 19:46:39 217 1

原创 多线程—(2.线程安全)

概念:多线程对于临界资源的访问操作是安全的。实现同步互斥互斥通过对临界资源同一时间的唯一访问保证访问安全。同步通过条件判断让线程对临界资源的访问更加合理。互斥的实现互斥锁原理本质上是一个01计数器,标记临界资源的两种状态访问资源之前加锁,通过计数器判断能否访问,不能则阻塞.访问资源之后解锁:通过计数器标记资源为可访问,唤醒阻塞。互斥锁本身也是临界资源,但是互斥锁自身通过原子操作保证自己安全。操作流程1.定义2.初始化3.访问临界资源之前加锁4.访问临界资源之后解锁5销毁互

2021-04-25 18:16:50 301

原创 多线程—(1.概念与线程控制)

线程概念什么是线程LWP:light weight process 轻量级的进程(在Linux环境下) 。线程是进程中的一条执行流程。进程是系统进行资源的分配基本单位,线程是系统进行调度运行的基本单位。各个线程之间共享同一个虚拟地址空间。线程共享资源1.虚拟地址空间2.每种信号的处理方式3.当前工作目录4.用户ID和组ID5.IO信息线程独有资源1.标识符2.栈3.寄存器4.errno变量5.信号屏蔽字6.调度优先级多线程与多进程优缺点多线程优点1.线程间

2021-04-21 17:41:47 177

原创 模拟实现stack,queue,priority_queue

stack#include<deque>using namespace std;template<class T,class Con=deque<T>>class Stack{public: Stack() { } void push(const T& x) { _c.push_back(x); } void pop() { _c.pop_back(); } T& top() { return _c.back(

2021-04-18 11:11:17 127

原创 list和vector区别

项目vectorlist底层结构动态顺序表,一段连续空间带头结点的双向循环链表随机访问支持随机访问,访问某个元素效率O(1)不支持随机访问,访问某个元素效率O(N)插入和删除任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低任意位置插入和删除效率高,不需要搬移元素,时间复杂度为O(1)空间利用率底层为连续空间,不容易造成内存碎片,空间利用率高,缓存利用率高底层节点动态...

2021-04-11 15:17:31 123

原创 进程信号

进程信号信号概念linux信号种类信号在内核中的表示信号的生命周期产生硬件产生软件产生注册注销处理处理方式1.默认处理2.忽略处理3.自定义处理方式自定义处理方式信号捕捉流程信号阻塞操作代码示例信号的基本作用SIGCHLD信号SIGPIPE信号信号概念信号就是一个软件中断,通知进程发生了某个事件,打断进程当前操作,去处理这个事件。linux信号种类1-31:非可靠信号34-64:可靠信号信号在内核中的表示每个信号都有两个标志位分别表示阻塞(block)和未决(pending),还有一个函数指

2021-04-11 15:03:37 142

原创 进程间通信

热同时

2021-04-09 14:59:54 193

原创 基础IO

库函数IO接口:fopen、fwrite、fread、fclose、fseekfopen打开文件FILE* fopen(const char* path,const char* mode)fopen的参数:path:要打开文件的路径名称mode:“r”:只读“r+”:可读可写“w”:只写,不存在时创建新文件“w+”:可读可写,不存在时创建新文件“a”:追加只写,将数据写入文件末尾,不存在则创建新文件“a+”:可读、追加写,从起始读,从末尾写,不存在则创建新文件“b”对:文

2021-04-07 17:19:08 143

原创 类的默认成员函数——拷贝构造函数

文章目录概念特征概念拷贝构造函数:只有 单个形参,该形参是对本类类型对象的 引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由 编译器自动调用。特征拷贝构造函数也是特殊的成员函数。其特点如下:1.拷贝构造函数是构造函数的一个重载形式。2.拷贝构造函数的参数 只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。错误示例:class Date{public: Date(int year = 2021, int month = 1, int day = 1

2021-04-06 16:52:57 2980

原创 类的默认成员函数——构造函数

概念对于以下的Date类,可以通过setDate公有的方法给对象设置内容,但是如果每次创建对象都调用该方法设置信息,就显得很麻烦,那能否在对象创建时,就将信息设置进去呢?#include<iostream>using namespace std;class Date{public: void setDate(int year, int month, int day) { _year = year; _month = month; _day = day; } voi

2021-04-06 16:52:51 515

原创 vector迭代器失效问题

vector的迭代器失效问题有两种情况1.引起底层空间改变的操作例如:resize、reserve、insert、assign、push_back等。来看代码:(编译器:VS2013)#include <iostream>using namespace std;#include <vector>int main(){ vector<int> v{ 1, 2, 3, 4, 5, 6 }; auto it = v.begin(); //1.r

2021-04-04 12:08:32 471

原创 C++模拟实现String类

目的模拟实现string类里的构造函数,拷贝构造,赋值运算符重载,析构函数,增删查改,迭代器等一些功能。模拟实现#include <stdlib.h>#include <string.h>#include<iostream>#include <assert.h>using namespace std;class String{public: typedef char* iterator; typedef const char* con

2021-03-30 17:06:44 161

原创 Linux实现简易版的shell

什么是shell现在我们使用的操作系统(Windows、Mac OS、Android、iOS等)都是带图形界面的,简单直观,容易上手,对专业用户(程序员、网管等)和普通用户(家庭主妇、老年人等)都非常适用;计算机的普及离不开图形界面。然而在计算机的早期并没有图形界面,我们只能通过一个一个地命令来控制计算机,这些命令有成百上千之多,且不说记住这些命令非常困难,每天面对没有任何色彩的“黑屏”本身就是一件枯燥的事情;这个时候的计算机还远远谈不上炫酷和普及,只有专业人员才能使用。对于图形界面,用户点

2021-03-24 10:47:30 375

原创 进程控制

文章目录进程创建函数fork写时拷贝函数vforkvfork和fork的区别进程退出进程退出的情况进程退出常见方式_exit函数exit函数return退出进程等待必要性进程等待的方法wait方法waitpid方法获取子进程status终止信号代码转换进程替换替换原理替换函数进程创建函数fork通过man可以查看到fork函数的作用:creates a new process by duplicating the calling process,通过复制调用进程来创建新进程。#includ

2021-03-22 17:05:28 156

原创 程序地址空间

文章目录Linux下看到的地址程序地址空间概念为什么需要虚拟地址?内存管理方式:缺页中断Linux下看到的地址先来看一段代码:可以看到父子进程输出的内容一样,地址一样,这很好理解因为子进程是以父进程为模板的。将代码修改一下后:可以看到,父子进程输出的内容不一样,这说明父子进程输出的不是一个变量,但是地址却是一样的。这是什么原因呢?首先要知道,我们通常所说的地址都是内存单元的编号,实际上硬件内存是不会有这些划分的。实际上,在进程中程序访问的这些地址都是虚拟地址。是系统给进程描述的。程

2021-03-20 17:07:21 221

原创 进程概念和进程状态

进程概念运行中的程序。对于操作系统来说就是PCB进程控制块,在Linux中就是一个task_struct结构体。是操作系统对程序运行的动态描述,系统通过这个描述实现程序运行的管理和调度。程序运行示例要运行main这个程序,操作系统找到对应main的PCB,在PCB上读取main运行所需要的的信息,加载到cpu上,cpu就开始运行这个程序了。PCB描述的信息(task_struct内容)内存指针:包括程序代码和进程相关数据的指针。上下文数据:进程执行时处理器的寄存器中的数据。程序计

2021-03-20 15:50:56 369

原创 LeetCode:82. 删除排序链表中的重复元素 II

删除排序链表中的重复元素 II给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例 1:输入: 1->2->3->3->4->4->5输出: 1->2->5示例 2:输入: 1->1->1->2->3输出: 2->3来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorte

2021-03-19 16:27:43 231

原创 内部类

内部类概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。注意:此时这个内部类是 一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类 。内部类就是外部类的友元类。注意友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。特性:内部类可以定义在外部类的public、protected、private都是可以的。内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。 sizeof(外部类)=外部

2021-03-18 15:20:08 104

原创 explicit关键字

explicit构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。示例:class Date{public: Date(int year) :_year(year) { }private: int _year;};void Test(){ Date d1(2020); //用一个整型变量给日期类对象赋值 //2021,编译器调用构造创建一个匿名对象,调用赋值运算符,把匿名对象内容赋给d1 d1 = 2021;}转换过程:上述代码

2021-03-18 15:19:47 89 1

原创 C++11基于范围的for循环

参考链接:http://c.biancheng.net/view/7759.htmlC++ 98/03中的for循环在C++11标准之前 ,如果要用 for 循环语句遍历一个数组或者容器,只能套用如下结构:for (表达式1; 表达式2; 表达式3){ //循环体}C++11范围for循环C++ 11提供了基于范围的 for 循环。在使用基于范围的 for 循环处理数组时,该循环可以自动为数组中的每个元素迭代一次。范围for格式for (DataType RangeVariable

2021-03-18 14:37:55 440

原创 linux基础指令和常用工具

基础指令目录操作ls列出目录的内容;ls -a 列出隐藏文件,文件中以开头的均为隐藏文件,如:~/.bashrcls -l 列出文件的详细信息ls -R 连同子目录中的内容起列出​pwd查看当前所在路径,当打开终端时,如果需要自己目前在哪一个目录,可以使用pwd命令,它返回一个绝对的路径(从根“/”开始的路径)mkdirmkdir用于创建目录,可以一次创建多个rmdirrmdir用于删除空目录,可以一次删除多个rm使用rm命令删除文件。但是rm不能简单地删除目录。使用“rm - r

2021-03-18 12:45:58 175

原创 this指针

首先我们定义一个日期类:#include <iostream>using namespace std;class Date{public: void Display() { cout << _year << "-" << _month << "-" << _day << endl; } void SetDate(int year, int month, int day) { _year = ye

2021-03-17 12:15:01 184

原创 C++模板基础(泛型编程的基础)

泛型编程  泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。泛型即是指具有在多种数据类型上皆可操作的含义,而模板也是泛型编程中的一种典型例子。函数模板概念函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。打个比方:  现在有一个锤子的模具,通过灌注不同的材料(类型)就可以得到,不同材料的锤子(生成具体类型的代码)。格式声明模板格式:template<typename T1,typename

2021-03-15 15:20:20 197

转载 C++内存管理

版权声明:本文为CSDN博主「skr爱码士」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/skrskr66/article/details/92769994栈和堆首先要理解一个关键的问题。我们此时说的是内存分配中的栈和堆,不是在讨论数据结构中的栈和二叉堆。我在之前学习操作系统的时候划过一个图,是关于Linux下操作系统程序地址空间的。中间还有栈区和堆区的分布。从图中可以看出基本分布,内存中的栈区是处于高地址以

2021-03-15 13:19:03 442

原创 C++动态内存管理-new&delete

文章目录引入new和delete的用法new\delete操作内置类型new\delete操作自定义类型注意operator new & operator deleteoperator new & operator delete的重载new和delete的实现原理内置类型自定义类型定位new表达式malloc/free和new/delete区别引入在C语言中,申请的空间都是在堆区上开辟的,申请的方式有三种:void* malloc(size_t size):size为要分配的字节数。

2021-03-15 12:42:23 195

空空如也

空空如也

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

TA关注的人

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