自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux】网络IO(select、poll、epoll)

系统提供select函数来实现多路复用输入/输出模型.select系统调用是用来让我们的程序监视多个文件描述符的状态变化的;程序会停在select这里等待,直到被监视的文件描述符有一个或多个发生了状态改变select定位:只负责等待,得到fd就绪,就通知上层进行读取或写入,没有读取或写入的功能。read、write、recv、send本身也有等待功能,但只能等待一个fd;但select可以同时等待多个fd。

2022-11-15 15:04:32 1100 1

原创 【数据结构】八大排序(超详解+附动图+源码)

前言所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。生活中各种地方都需要用到排序,所以学好排序算法是非常重要的。排序分为 内部排序 和 外部排序。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。这部分主要是内部排序。排序讲解都以升序为例。常见的排序算法:// 排序实现的接口// 插入排序void InsertSort(int* arr..

2021-11-21 20:07:05 79777 151

原创 【C++】C++11 新特性

C++11:列表初始化、decltype、右值引用、lambda表达式、包装器、thread线程库、条件变量

2023-03-02 22:23:50 1086 4

原创 【C++】C++11 异常

异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。catch: 在你想要处理问题的地方,通过异常处理程序捕获异常,catch 关键字用于捕获异常,可以有多个catch进行捕获。try: try 块中的代码标识将被激活的特定异常,它后面通常跟着一个或多个 catch 块。

2023-03-02 21:41:10 554 3

原创 【C++】哈希表

(1)依次读取IP,i = BKDRHash(ip)%200(n),i是多少ip就进入对应编号的小文件中,相同的ip就一定进入了同一个小文件,然后使用map统计一个小文件的ip的次数,就是这个ip准确的次数。注意:该函数中实际调用哈希桶的插入操作,用参数key与V()构造一个默认值往底层哈希桶中插入,如果key不在哈希桶中,插入成功,返回V(),插入失败,说明key已经在哈希桶中,将key对应的value返回。近似算法:将一个文件放入布隆过滤器,遍历另一个文件,看它在布隆过滤器中有没有,如果存在就是交集。

2023-02-23 21:19:34 757

原创 【Linux】UDP、TCP协议

在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过netstat -n查看);IP+端口号,用来表明互联网中的唯一一台主机上的唯一一个进程。

2022-10-31 21:04:23 912

原创 【Linux】Http协议

Http协议

2022-10-29 21:32:50 1868 1

原创 【Linux】套接字编程

创建socket的过程(socket()),本质是打开文件。(仅有系统相关的内容)2.bind(),struct sockaddr_in -> ip,port,本质是ip+port和文件信息进行关联listen(),本质是设置该socket文件的状态,允许别人来连接我accpet(),获取新链接到应用层,是以fd为代表的;所谓的连接,在OS层面,本质其实就是一个描述连接的结构体(文件)read/write,本质就是进行网络通信,对于用户来讲就相当于在进行正常的文件读写。

2022-10-19 17:26:49 1534

原创 【Linux】线程池

线程虽然比进程轻量了很多,但是每创建一个线程时,需要向操作系统申请空间创建,如果需要开辟大量的线程,申请和销毁的开销也是很大的。所以如果能够提前申请一块空间,专门用来创建线程,那么就能提高一些效率。线程池:一种线程使用模式,线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过度。...

2022-08-15 20:59:58 362 3

原创 【C++】map和set的使用

目录1. 内容补充1.1. 序列式容器与关联式容器1.2. 键值对1.3. 树形结构的关联式容器2. set的使用2.1. set的介绍2.2. set的使用2.3. multiset的介绍2.4. multiset的使用3.map的使用3.1. map的介绍3.2. map的使用3.3. multimap的介绍3.4. multimap的使用1. 内容补充1.1. 序列式容器与关联式容器我们已经接触过STL中的部分容器,比如:ve

2022-05-22 21:11:01 1246 36

原创 【Linux】线程同步和互斥

目录前言1.线程互斥1.1. 背景概念1.2. 互斥锁1.3. 互斥锁原理2.可重入函数、线程安全和死锁(了解)2.1. 重入和线程安全2.2. 死锁2.2.1. 概念3. 线程同步3.1. 条件变量3.1.1. 概念3.1.2. 条件变量对应操作函数3.1.3.基于阻塞队列的生产者消费者模型3.2. POSIX信号量3.2.1. 概念3.2.2. 信号量对应操作函数3.2.3. 基于环形队列的生产者消费者模型3.3. 总结

2022-05-19 15:06:39 1056 34

原创 【Linux】线程概念

目录1. 线程1.1. 线程概念1.2. Linux下的线程线程的优点线程的缺点1.3. 进程与线程2.线程控制2.1. 线程创建2.2. 线程等待2.3. 线程终止2.4. 线程分离3.线程ID1. 线程1.1. 线程概念一般而言,线程是在进程内部运行的一个执行分支(执行流),属于进程的一部分,粒度要比进程更加细和轻量化。一个进程内是可能存在多个进程的。那么操作系统内就存在更多的线程,所以操作系统管理线程的方式依旧是:先描述,再组

2022-05-12 20:54:09 1214 42

原创 【C++】二叉搜索树

目录1. 什么是二叉搜索树2. 二叉搜索树的实现2.1. 二叉搜索树的插入2.2. 二叉搜索树的删除2.3. 二叉搜索树的查找3. 二叉搜索树的应用4.二叉搜索树的性能5. 二叉树面试题5.1.根据二叉树创建字符串5.2.二叉树的层序遍历5.3.二叉树的最近公共祖先5.4.二叉搜索树与双向链表5.5.从前序与中序遍历序列构造二叉树5.6.二叉树的前序遍历(非递归实现)5.7.二叉树的中序遍历(非递归实现)5.8.二叉树的后序遍...

2022-05-10 13:05:51 634 11

原创 【Linux】进程信号

1. 进程信号概念信号是进程之间事件异步通知的一种方式,属于软中断,本质也是数据 。信号是给进程发的,进程在收到信号后,会在合适的时候执行对应的命令。进程具有识别信号并处理信号的能力。进程收到信号,不一定会立即处理信号,在合适的时候处理,信号保存在进程PCB中。信号是操作系统发送给进程的。查看信号kill -llinux中共有62个信号,前31个为普通信号,34到64为实时信号(不学习)。以前,我们在使用ctrl c 结束进程时,本质是向指定进程发送2号信号。.

2022-05-07 09:05:19 979 44

原创 【Linux】进程间通信

目录1. 进程间通信1.1. 进程间通信的目的1.2. 如何实现进程间通信2. 管道通信2.1. 匿名管道2.1.1 创建匿名管道2.1.2 . 深入理解匿名管道2.2. 命名管道2.2.1. 创建命名管道3. system V 标准进程间通信3.1. 共享内存3.1.1. 实现原理3.1.2. 代码实现3.2. 消息队列(了解)3.2.1 实现原理3.3. 信号量(了解)3.3.1. 实现原理1. 进程间通信1.1.

2022-05-02 18:50:10 16293 41

原创 【Linux】动静态库

目录概念动态库与静态库如何制作动静态库静态库动态库总结概念一般库分为两种:动态库和静态库,他们都是文件。静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文 件的整个机器码。在可执行文件开始运行以前,外部函数的机器码由操作系统从磁

2022-05-02 18:33:04 710 16

原创 【Linux】基础IO

目录1. C语言文件操作1.1. 一般使用1.2. C程序的三个默认输入输出流2. 使用文件系统调用接口2.1. open2.2. write2.3. read3. 文件描述符fd4. 标准输入、标准输出、标准错误5. 重定向原理5.1. 输出重定向5.2. 输入重定向6. dup2接口7. 缓冲区8. Linux文件系统8.1. inode8.2. 软硬链接1. C语言文件操作1.1. 一般使用回顾一下C语言中的读写文

2022-04-29 13:49:28 1864 11

原创 【Linux】进程控制

1.进程创建1.1. fork创建子进程fork创建子进程前面已经见过,现在来详细学习它的使用。#include <unistd.h>pid_t fork(void);返回值:自进程中返回0,父进程返回子进程id,出错返回-1进程调用fork,当控制转移到内核中的fork代码后,内核做 : 分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进程到系统进程列表当中 fork返回,开始调度器调度

2022-04-25 08:52:26 689 29

原创 【Linux】进程地址空间

1.回顾C/C++程序地址空间这是我们以前理解的内存布局,那么这是真正的内存吗?不是!先来验证一下:#include<stdio.h>#include<unistd.h>#include<stdlib.h>int g_unval;int g_val=10;int main(){ const char*s = "hello wrold"; int a = 10; int*arr = (int*)malloc(4);

2022-04-25 08:52:15 466 24

原创 【Linux】环境变量

1.什么是环境变量环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性 。我们所写的命令,程序,工具....本质都是可执行文件。例如:我们写了这样一个程序,编译好后就成了一个可执行文件。也可以称为命

2022-04-22 17:41:39 3740 11

原创 【Linux】进程

概念什么是进程磁盘上的文件加载到内存上,并为他创建PCB(与进程相关的数据结构)进程控制块(PCB)任何进程在形成之时,操作系统要为该进程创建PCB,用来描述进程的所有属性,管理进程的资源。本质是一个结构体。task_struct在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。task_ struct内容分类标示符(pid): 描述本进程的唯一.

2022-04-16 19:07:47 2223 9

原创 【C++】多态

1. 什么是多态我的理解是:不同的对象完成某个相同的行为,会产生不同的状态。多态分为编译时多态和运行时多态。编译时多态(静态):例如函数重载,看起来是调用同一个函数,却有不同的行为运行时多态(动态):父类的指针或引用去调用函数,传递不同的对象,会调用不同的函数例如:去商场购物,有些商场根据以往消费情况将会员分为普通会员、黄金会员、钻石会员...不同的会员在消费时可以使用不同的折扣对商品打折。2. 多态的定义2.1. 多态构成条件在继承中要构成多态的两个条件:

2022-04-13 10:41:02 1910 12

原创 【C++】继承

目录1. 概念2. 定义2.1. 使用格式2.2. 继承方式与限定修饰符3. 基类和派生类对象赋值转换 (public继承)4. 继承中的作用域5. 子类类的默认成员函数6. 继承与友元7. 静态成员8. 菱形继承和虚继承8.1 菱形继承8.2 虚继承(virtual)8.3 虚继承解决数据冗余和二义性的原理9. 继承总结、继承与组合9.1总结9.2 继承与组合1. 概念继承(inheritance)机制是面向对象程序设..

2022-04-08 12:14:39 8625 26

原创 【C++】模板

前言在前面认识模板章节,我们大概解了模板在函数和类中的简单使用,但是模板可不止这么简单,它还有更多的用法,本章就来对一些用法进行学习。1. 非类型模板参数模板参数分类类型形参与非类型形参。类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。例如:#include<iostream>using namespace std;.

2022-04-05 11:35:43 3097 12

原创 【C++】priority_queue(优先级队列)

1. prioriy_queue介绍如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了优先级队列 这种数据结构。优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 ,一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 。对于优先权相同的元素,可按

2022-04-03 12:00:02 5457 2

原创 【C++】stack and queue

目录1. stack1.1. stack常用接口实现2. queue2.1. 常用接口模拟实现3. 容器适配器3.1. 适配器3.2.STL标准库中stack和queue的底层结构4.stack&queueOJ题4.1.最小栈4.2.栈的弹出、压入序列4.3.逆波兰表达式求值1. stackSTL---stack文档关于stack是什么和怎么用这里不再介绍。实现也只是贴代码(毕竟太简单)。1.1. stack常用接口实...

2022-04-02 20:47:56 1297 21

原创 【C++】list

1.list介绍通过前面的数据结构阶段的学习和string以及vetcor的学习,学习list简直就是砍瓜切菜。STL中额list是一个双向带头循环链表,具体结构不再多说。2.list常用接口模拟实现

2022-04-02 10:36:18 1304 14

原创 【C++】vector

1. vector介绍1.1 什么是vector1. vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自 动处理。3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小 为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言

2022-03-31 17:42:21 1032 17

原创 【C++】string

前言为什么C++中增加了string类型,而不继续使用C语言中的字符串?C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问,可能会出现很多错误。同时在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。...

2022-03-04 18:00:01 1618 52

原创 【Linux】Linux开发工具(yum,vim,gcc/g++,gdb,git)

1.yum在Windows环境下安装软件一般在浏览器或者软件管家上面安装。那么在Linux环境下该如何安装软件?1.1软件包在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装. 软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系

2022-03-03 15:59:01 1927 54

原创 【Linux】权限

1.用户linux下有两种用户:超级用户(root)、普通用户。超级用户:可以再linux系统下做任何事情,不受限制普通用户:在linux下做有限的事情。超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。超级用户:普通用户:第一次进入linux中,默认用户为超级用户,因为没有创建普通用户。1.1用户管理创建普通用户:用户名:adduser name密码:passwd name删除普通用户:userdel name1.2..

2022-02-27 20:50:42 1145 4

原创 【C++】泛型编程---认识模板

1. 泛型编程2. 函数模板2.1 函数模板概念2.2函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则3. 类模板3.1 类模板的定义格式3.2 类模板的实例化

2022-02-21 14:40:24 277 6

原创 【C++】内存管理

1.new/delete1.1 new/delete操作内置类型1.2 new和delete操作自定义类型2.operator new与operator delete函数3.new和delete的实现原理3.1内置类型3.2自定义类型4.定位new表达式

2022-02-21 14:04:32 229 14

原创 【Linux】基础指令

1.ls语法: ls [选项][目录或文件]功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。常用选项:-a 列出目录下的所有文件,包括以 . 开头的隐含文件。-d 将目录象文件一样显示,而不是显示其下的文件。 如: ls –d 指定目录-i 输出文件的 i 节点的索引信息。 如 ls –ai 指定文件-k 以 k 字节的形式表示文件的大小。 ls –alk 指定文件-l 列出文件的详细信息。-n 用数字的 UID,GID 代替名称。 (介绍 UID, G

2022-02-15 16:42:40 1012 32

原创 【C++】类和对象(下)

1.构造函数之回首掏(doge)2.static成员3.C++11 的成员初始化4.友元5.内部类(了解)

2021-12-18 20:26:29 1858 63

原创 【C++】类和对象(上)

1.面向过程和面向对象C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。2.类的定义C++中类的关键字既可以用class,也可以用struct。常用的是class。类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。class className{ // 类体:由成员函数和成员变量组成}; 例如:一个.

2021-12-11 12:03:33 3205 60

原创 【C++】extern “C“ 用法详解

前言

2021-12-03 21:06:58 3582 43

原创 剑指 Offer . 排序数组中只出现一次的数字(中等)

原题在这里->排序数组中只出现一次的数字给定一个只包含整数的有序数组 nums,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。示例 1:输入: nums = [1,1,2,3,3,4,4,8,8]输出: 2示例 2:输入: nums = [3,3,7,7,10,11,11]输出: 10提示:1 <= nums.length <= 1050 <= nums[i]<= 105进阶:采用的方案可以在 O(log n...

2021-12-02 09:10:36 659 27

原创 【C++】初窥门径---入门篇

前言经过前面对C语言和数据结构初阶的学习,自己也初步进入了编程的世界。从最初的兴趣至极,到热情消减,转至平淡,再到现在代码已经逐渐为生活的一部分。越发感觉代码的奇妙,编程世界的广阔无垠。希望两年后的自己回首往昔,能够为之感叹~感谢各位读者的点赞与支持,与君共勉!从本章开始,将进入C++学习阶段。1.命名空间在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进

2021-11-28 19:43:47 2865 50

原创 【数据结构】二叉树经典OJ练习

前言本章只是二叉树的部分简单练习,对于这部分题目大多比较简单,但重要的不是能过OJ,而是深入理解每一道题的解题原理。多思考,勤动手,才是正解。对于编程,我们要做到画图半小时,写代码五分钟;而不是写代码五分钟,调试三十分钟。理解递归思想,分治思想,温故而知新~1.单值二叉树单值二叉树根据题目描述,判断二叉树的每个节点的值是否相同。方法:先判断根节点与左右子节点的值是否相等。 进而递归判断左右子树的根节点与左右子节点的值是否相等。代码如下:bool isU.

2021-11-15 19:42:07 2823 26

空空如也

空空如也

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

TA关注的人

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